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

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 }

 

posted @ 2018-10-30 20:18  Reqaw  阅读(453)  评论(0编辑  收藏  举报