1. 程式人生 > >The 15th Zhejiang Provincial Collegiate Programming Contest(部分題解)

The 15th Zhejiang Provincial Collegiate Programming Contest(部分題解)

begin iter 一個數 ons opera cst style string +=

ZOJ 4024 Peak

題意

給出n和n個數,判斷該數列是否是凸形的。

解題思路

從前往後第一對逆序數,和從後往前第一隊逆序數,如果都非零而且相鄰,證明該數組是凸形的。

代碼

 1 #include <cstdio>
 2 const int maxn = 100000 + 10;
 3 int a[maxn];
 4 
 5 int main() 
 6 {
 7     int T;
 8     scanf("%d", &T);
 9     while(T--) {
10         int n;
11         scanf("%d", &n);
12         for
(int i = 0; i < n; i++) { 13 scanf("%d", &a[i]); 14 } 15 int q = 0, h = 0, i; 16 for(i = 0; i < n - 1; i++) { 17 if(a[i] < a[i + 1]) 18 q++; 19 else 20 break; 21 } 22 for(; i < n - 1
; i++) { 23 if(a[i] > a[i + 1]) 24 h++; 25 else 26 break; 27 } 28 //printf("%d %d\n", q, h); 29 30 if(q && h && q + h == n - 1) 31 puts("Yes"); 32 else 33 puts("No
"); 34 } 35 return 0; 36 }

ZOJ 4025 King of Karaoke

題意

給出n,然後給出兩個長度為n的序列S 和 D,問給每個D加上一個數k(可正,可負,可零),最大的耦合度是多少

解題思路

先用S減D得到每個差值的次數,然後找到差值次數最多的數即可。

代碼

 1 #include <cstdio>
 2 #include <map>
 3 
 4 using namespace std;
 5 const int maxn = 100000 + 10;
 6 int D[maxn], S[maxn];
 7 int n;
 8 
 9 map<int, int> mp;
10 int main()
11 {
12     int T;
13     scanf("%d", &T);
14     while(T--) {
15         scanf("%d", &n);
16         for(int i = 0; i < n; i++) {
17             scanf("%d", &D[i]);
18         }
19         for(int i = 0; i < n; i++) {
20             scanf("%d", &S[i]);
21         }
22         
23         mp.clear();
24         for(int i = 0; i < n; i++) {
25             mp[S[i] - D[i]]++;
26         }
27         int maxc = 0;
28         map<int, int>::iterator it;
29         for(it = mp.begin(); it != mp.end(); it++) {
30             if((*it).second > maxc)
31                 maxc = (*it).second;
32         }
33         printf("%d\n", maxc);
34     }    
35     return 0;
36 }

ZOJ 4036 Lucky 7

給出n和k,然後n個數,只要有一個數加上k能夠將7整除,就是Yes。

 1 #include <cstdio>
 2 
 3 int n, k;
 4 int main()
 5 {
 6     int T;
 7     scanf("%d", &T);
 8     while(T--) {
 9         scanf("%d%d", &n, &k);
10         int a, f = 0;
11         for(int i = 0; i < n; i++) {
12             scanf("%d", &a);
13             if((a + k) % 7 == 0)
14                 f = 1;
15         }
16         if(f)
17             puts("Yes");
18         else
19             puts("No");
20     }
21     return 0;
22 }

ZOJ 4035 Doki Doki Literature Club

給出n個單詞列表和單詞限制數m,然後每個單詞的滿足度,問組成m個最大滿意度的單詞列表。

排序,註意先按滿意度排,再按照字典序排,另外可能超int範圍。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 const int wl = 15 + 10;
 7 const int maxw = 100 + 10;
 8 struct Word {
 9     char w[wl];
10     int s;
11     bool operator < (const struct Word &a) const {
12         if(a.s == s) {
13             if(strcmp(a.w, w) > 0)
14                 return 1;
15             else
16                 return 0;
17         }
18         return a.s < s;
19     }
20 }wo[maxw];
21 
22 int n, m;
23 int main()
24 {
25     int T;
26     scanf("%d", &T);
27     while(T--) {
28         scanf("%d%d", &n, &m);
29         for(int i = 1; i <= n; i++) {
30             scanf("%s %d", wo[i].w, &wo[i].s);
31         }
32         
33         sort(wo + 1, wo + n + 1);
34         /*for(int i = 1; i <= n; i++) {
35             printf("%s %d\n", wo[i].w, wo[i].s);
36         }*/
37         long long sc = 0;
38         for(int i = 1; i <= m; i++) {
39             sc += (long long)(m - i + 1) * wo[i].s;
40         }
41         printf("%lld",sc);
42         for(int i = 1; i <= m; i++) {
43             printf(" %s", wo[i].w);
44         }
45         puts("");
46     }    
47     return 0;
48 }

The 15th Zhejiang Provincial Collegiate Programming Contest(部分題解)