其他分享
首页 > 其他分享> > Codeforces Round #539 (Div. 2)

Codeforces Round #539 (Div. 2)

作者:互联网

题目链接:http://codeforces.com/contest/1113

A:贪心,开始加满,后面用一站加一站。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     std::ios::sync_with_stdio(false);
 6     int n, k;
 7     cin >> n >> k;
 8     n -= 1;
 9     int ans = 0;
10     if(k >= n) ans = n;
11     else{
12         for(int i = 1;i <= n - k;i++) ans += i + 1;
13         ans += k;
14     }
15     cout << ans << endl;
16     return 0;
17 }
View Code

B:预处理,100以内所有变化,用总得减去变化最多的就是答案最少的,一开始做没瞅着只能变俩个数。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn =105;
 4 int vis[maxn];
 5 int d[maxn][maxn];
 6 int main()
 7 {
 8     std::ios::sync_with_stdio(false);
 9     int n;
10     cin >> n;
11     int a = 0;
12     int sum = 0;
13     for(int i = 0;i < n;i++) cin >> a, sum += a, vis[a] ++;
14     for(int i = 1;i <= 100;i++)
15         for(int j = 1;j <= 100;j++){
16             for(int k = 1;k <= i;k ++)
17             {
18                 if(i % k == 0)
19                 {
20                     d[i][j] = max(d[i][j], i + j - i/k - j*k);
21                 }
22             }
23         }
24     int ans = 0;
25     for(int i = 1;i <= 100;i++)
26     {
27         if(!vis[i]) continue;
28         for(int j = 1;j <= 100;j++)
29         {
30             if(vis[j]) ans = max(ans, d[i][j]);
31         }
32     }
33     cout << sum - ans << endl;
34     return 0;
35 }
View Code

C:求前缀异或和,因为一个数异或它本身为0,前后区间异或值相同可以维护前缀异或和来找。学会了个unordered_map

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 3e5 + 5;
 5 ll a;
 6 ll sum[maxn];
 7 unordered_map<int,int > mp[2];
 8 int main()
 9 {
10     int n;
11     cin >> n;
12  
13     for(int i= 1;i <= n;i++) cin >> a,sum[i] = sum[i - 1]^a;
14     ll ans = 0;
15     for(int i = 0;i <= n;i++)
16     {
17         int t = i%2;
18         if(mp[t].count(sum[i])) ans += mp[t][sum[i]];
19         if(mp[t].count(sum[i])) mp[t][sum[i]] ++;
20         else mp[t][sum[i]] = 1;
21     }
22     cout << ans << endl;
23     return 0;
24 }
View Code

D:没想到只有 1 和 2俩种切法,因为数据不大 可以先检查 1,在讨论 2,只有在子串都相同或者 转化完和原来一样的情况输出impossable。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e5 + 5;
 4 char s[maxn], a[maxn];
 5 int main()
 6 {
 7     int n;
 8     cin >> s;
 9     n = strlen(s);
10     bool flag = true;
11     for(int i = 1;i < n;i++) if(s[i] != s[0]) flag = false;
12     if(flag) cout << "Impossible" << endl;
13     else{
14         for(int i = 1;i < n;i++){
15             int cnt = 0;
16             for(int j = i;j < n;j++) a[cnt++] = s[j];
17             for(int j = 0;j < i;j++) a[cnt++] = s[j];
18             flag = true;
19             for(int j = 0;j < n;j++) if(a[j] != s[j]) flag = false;
20             if(flag) continue;
21             else{
22                 int l = 0, r = n - 1;
23                 bool vis = true;
24                 while(l <= r){
25                     if(a[l] != a[r]) vis = false;
26                     l++, r--;
27                 }
28                 if(vis){
29                         cout << "1" << endl;return 0;
30                 }
31             }
32         }
33         if(n%2 == 0) cout << "2" << endl;
34         else{
35                 bool vis = true;
36             for(int i = n / 2 - 1;i >= 1;i--){
37                 if(s[i] != s[0]) vis = false;
38             }
39             if(vis) cout << "Impossible" << endl;
40             else cout << "2" << endl;
41         }
42  
43     }
44     return 0;
45 }
View Code

 

标签:std,int,sum,Codeforces,cin,maxn,Div,ll,539
来源: https://www.cnblogs.com/Carered/p/11366552.html