Codeforces Round #579 (Div. 3)

打得巨差。题目链接:https://codeforces.com/contest/1203


A:

正着来一遍倒着来一遍就行。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 int q;
21 int a[300];
22 
23 int main() {
24     scanf("%d", &q);
25     while (q--) {
26         int n; scanf("%d", &n);
27         int p, k;
28         rep1(i, 1, n) {
29             scanf("%d", &a[i]);
30             if (a[i] == 1) k = p = i;
31         }
32         if (n == 1) {
33             puts("YES");
34             continue;
35         }
36         int flag1 = 1, flag2 = 1, last = a[k];
37         while (1) {
38             p++;
39             if (p > n) p = 1;
40             if (a[p] - last != 1) {
41                 flag1 = 0; break;
42             }
43             last = a[p];
44             if (a[p] == n) break;
45         }
46         last = a[k]; p = k;
47         while (1) {
48             p--;
49             if (!p) p = n;
50             if (a[p] - last != 1) {
51                 flag2 = 0; break;
52             }
53             last = a[p];
54             if (a[p] == n) break;
55         }
56         if (flag1 || flag2) puts("YES"); else puts("NO");
57     }
58     return 0;
59 }
View Code

B:

因为面积要相等,显然对棍子排序之后最小匹配最大,次小匹配次大,以此类推。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const int maxn = 500;
21 int n, a[maxn], t;
22 
23 int main() {
24     scanf("%d", &t);
25     while (t--) {
26         scanf("%d", &n); n = n * 4;
27         for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
28         sort(a + 1, a + 1 + n);
29         int p = 1, q = n, area = -1, flag = 1;
30         while (p < q) {
31             if (area == -1) area = a[p] * a[q];
32             else if (a[p]*a[q] != area) {
33                 flag = 0; break;
34             }
35             if (a[p] != a[p + 1] || a[q] != a[q - 1]) {
36                 flag = 0; break;
37             }
38             p += 2, q -= 2;
39         }
40         if (flag) puts("YES"); else puts("NO");
41     }
42     return 0;
43 }
View Code

C:

求一遍gcd,答案就是gcd的因数个数。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const int maxn = 4e5 + 10;
21 int a[maxn], n;
22 
23 int main() {
24     scanf("%d", &n);
25     ll gcd = 1, k; scanf("%lld", &k);
26     gcd = k;
27     for (int i = 1; i < n; i++) {
28         ll x; scanf("%lld", &x);
29         gcd = __gcd(gcd, x);
30     }
31     if (gcd == 1) return puts("1"), 0;
32     int cnt = 0;
33     for (ll i = 1; i < sqrt(gcd); i++)
34         if (gcd % i == 0) cnt += 2;
35     ll tmp = sqrt(gcd);
36     if (tmp * tmp == gcd) cnt++;
37     printf("%d\n", cnt);
38     return 0;
39 }
View Code

D:

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 string s, t;
21 
22 int main() {
23     cin >> s >> t;
24     int len1 = s.size(), len2 = t.size();
25     vector<int>pre(len2), suf(len2);
26     int cur = 0;
27     // pre存放从前往后扫时字符串t中的字母在字符串s中出现的位置
28     for (int i = 0; cur < len2; i++)
29         if (s[i] == t[cur])
30             pre[cur++] = i;
31     // suf存放从后往前扫时字符串t中字母在字符串s中出现的位置
32     cur = len2;
33     for (int i = len1; i--;) {
34         if (s[i] == t[cur - 1])
35             suf[--cur] = i;
36     }
37     // 这样得到的pre数组是字符串t中的每个字母在字符串s中最早出现的下标
38     // suf数组同理,得到的是最晚出现的下标
39     int ans = max(len1 - 1 - pre.back(), suf[0]);
40     for (int i = 0; i + 1 < len2; i++)
41         ans = max(ans, suf[i + 1] - pre[i] - 1);
42     printf("%d\n", ans);
43     return 0;
44 }
View Code

E:

给定n个数,每个数x只能变成x-1,x+1或不变。问经过若干次变化后,最多能选出多少个不同的数。

贪心。排序后检查每个数并与一个值last进行比较。若x-1>last,则ans++,last=x-1。其余情况同理。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 int n, ans = 0;
21 vector<int>a;
22 
23 int main() {
24     scanf("%d", &n);
25     for (int i = 1; i <= n; i++) {
26         int x; scanf("%d", &x);
27         a.pb(x);
28     }
29     sort(a.begin(), a.end());
30     int last = 0;
31     for (auto i : a) {
32         if (i - 1 > last) ans++, last = i - 1;
33         else if (i - 1 == last) ans++, last = i;
34         else if (i == last) ans++, last = i + 1;
35     }
36     printf("%d\n", ans);
37     return 0;
38 }
View Code

F:

猜你喜欢

转载自www.cnblogs.com/JHSeng/p/11349546.html