2018浙江省省赛

A - Peak ZOJ - 4024

题目大意:判断数列是否是先递增后递减数列  

从两端分别以递增和递减判断 看第一个不满足递增或递减的数是否相等并且没越界就可以了

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 #include<queue>
 8 #include<map>
 9 #include<set>
10 int main(){
11     int t;
12     scanf("%d", &t);
13     int n;
14     int a[100005];
15     while (t--){
16         memset(a, 0, sizeof(a));
17         scanf("%d", &n);
18         for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
19         int l = 1, r = n;
20         while (l < n && a[l] < a[l + 1]) l++;
21         while (r > 1 && a[r] < a[r - 1]) r--;
22         if (l == r && l != 1 && l != n) cout<<"Yes"<<endl;
23         else cout<<"No"<<endl;
24     }
25     return 0;
26 }
View Code

B - King of Karaoke ZOJ - 4025 

求两个序列的相对元素的差出现次数最多的,最低出现一次。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <map>
 4 using namespace std;
 5 const int maxn = 100005;
 6 int test,n,d[maxn],x;
 7 int main()
 8 {
 9     ios::sync_with_stdio(false);
10     cin >> test;
11     while (test--)
12     {
13         cin >> n;
14         for (int i = 0;i < n;i++) cin >> d[i];
15         map<int, int> mp;
16         int ans = 1;
17         for (int i = 0;i < n;i++)
18         {
19             cin >> x;
20             mp[d[i] - x]++;
21             if (mp[d[i] - x] > ans)
22                 ans = mp[d[i] - x];
23         }
24         cout << ans << endl;
25     }
26     return 0;
27 }
View Code

 I - Magic Points ZOJ - 4032 

题意:给你3n个点,编号从0到3n-1,呈正方形分布,找n对点连起来,让线与线的交点经可能多。

题解:最下面的这n个点,前n - 1个点和第n + 1到 2n - 1个点相连,第n个点和第3n - 2个相连。特判一下n == 2 的情况。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <queue>
 6 using namespace std;
 7 typedef long long ll;
 8 int main()
 9 {
10     int t, n;
11     scanf("%d", &t);
12     while (t--)
13     {
14         scanf("%d", &n);
15         if (n == 2) {
16             printf("0 2 1 3\n");
17             continue;
18         }
19         for (int i = 0; i < n - 1; i++)
20         {
21             printf("%d %d ", i, i + n);
22         }
23         printf("%d %d\n", n - 1, 3 * n - 2);
24     }
25     return 0;
26 }
View Code

J - CONTINUE...? ZOJ - 4033 

题意:第一行给出T代表有几个测试样例,第二行给出n代表有几个人,第三行给出一个由0和1组成的字符串,0代表女生,1代表男生。并且第i个人有i个宝石。现在要把这些人分为四组,G1 G2 两组是女生组,G3 G4两组是男生组。分配后要满足  (G1+G3)的宝石 ==(G2+G4)的宝石然后输出这些人被分配到哪一组的字符串。如果有多个结果随便哪一个都行,如果没有结果输出-1。

 1 #include<iostream>
 2 #include<map>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 #include<cstdio>
 9 #include<set>
10 #define inf 0x3f3f3f3f
11 const int maxn = 110;
12 using namespace std;
13 int main() {
14     int T;
15     scanf("%d", &T);
16     while (T--) {
17         long long int n;
18         scanf("%lld", &n);//因为要求下面的sum,如果是int就会爆。
19         char s[100010];
20         long long str[100010] = { 0 };
21         getchar();
22         for (int i = 1;i <= n;i++)scanf("%c", &s[i]);
23         long long sum =  n * (n + 1) / 2;
24         if (sum % 2 != 0) { puts("-1");continue; }
25         long long half = sum / 2;
26         for (int i = n;i >= 1;i--) {
27             if (half >= i) {
28                 if (s[i] == '1')str[i] = 3;
29                 else str[i] = 1;
30                 half -= i;
31                 if (half == 0)break;
32             }
33             else {
34                 if (s[i] == '1')str[i] = 4;
35                 else str[i] = 2;
36             }
37         }
38         for (int i = 1;i <= n;i++) {
39             if (str[i] == 0) {
40                 if (s[i] == '1')str[i] = 4;
41                 else str[i] = 2;
42             }
43         }
44         for (int i = 1;i <= n;i++)printf("%lld", str[i]);
45         printf("\n");
46     }
47     return 0;
48 }
View Code

 L - Doki Doki Literature Club ZOJ - 4035

 1 #include<iostream>
 2 #include<map>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 #include<cstdio>
 9 #include<set>
10 #define inf 0x3f3f3f3f
11 const int maxn = 110;
12 using namespace std;
13 struct node {
14     string word;
15     long long int num;
16 }N[maxn];
17 bool cmp(node a,node b) {
18     if (a.num != b.num)return a.num > b.num;
19     return a.word < b.word;
20 }
21 int main() {
22     ios::sync_with_stdio(false);
23     cin.tie(0);
24     cout.tie(0);
25     int T;
26     cin >> T;
27     while (T--) {
28         int n, m;
29         cin >> n >> m;
30         string word;
31         int num;
32         for (int i = 1;i <= n;i++) {
33             cin >> N[i].word >> N[i].num;
34         }
35         sort(N + 1, N + 1 + n, cmp);
36         long long ans = 0;
37         for (int i = 1;i <= m;i++) {
38             ans = ans + N[i].num * (m - i + 1);
39         }
40         cout << ans << " " ;
41         for (int i = 1;i <= m;i++) {
42             if (i == m)cout << N[i].word << endl;
43             else cout << N[i].word << " ";
44         }
45     }
46     return 0;
47 }
View Code

 

M - Lucky 7 ZOJ - 4036

 1 #include<iostream>
 2 #include<map>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cmath>
 7 #include<queue>
 8 #include<cstdio>
 9 #define inf 0x3f3f3f3f
10 #define maxn 1010
11 using namespace std;
12 int main() {
13     int T;
14     scanf("%d", &T);
15     while (T--) {
16         int n, m,arr[maxn];
17         scanf("%d%d", &n, &m);
18         int flag = 0;
19         for (int i = 1;i <= n;i++) {
20             scanf("%d", &arr[i]);
21             if ((arr[i] + m) % 7 == 0) { flag = 1; }
22         }
23         if (flag)puts("Yes");
24         else puts("No");
25     }
26     return 0;
27 }
View Code

 

posted @ 2020-02-14 22:26  programmer_w  阅读(2)  评论(0)    收藏  举报