score:1336 (-45), pupil
Rank: 3313(又炸了,没啥好说的。。)
B.http://codeforces.com/contest/1215/problem/B
这个题万万没想到是dp,我的天,一开始直接上暴力,没仔细分析时间复杂度,估计是最近网络赛暴力惯了,没缓过神来。。。
分析见代码:
1 /* 2 设pos[i]表示以i为结尾的正区间,neg[i]表示以i为结尾的负区间。状态转移很容易了,见代码 3 这次真的wa到自闭了,后来改了改竟然又tle,真的自闭到家。。。自闭到家。。。。。 4 */ 5 #include <bits/stdc++.h> 6 using namespace std; 7 typedef long long ll; 8 const int maxn = 1e6; 9 ll pos[maxn], neg[maxn]; 10 11 int main() 12 { 13 int n; cin >> n; 14 int x; 15 ll maxpos, maxneg; 16 17 maxpos = maxneg = 0; 18 for (int i = 1; i <= n; i++) 19 { 20 scanf("%d", &x); 21 if (x < 0) 22 { 23 pos[i] = neg[i - 1]; 24 neg[i] = 1 + pos[i - 1]; 25 } 26 else 27 { 28 pos[i] = 1 + pos[i - 1]; 29 neg[i] = neg[i - 1]; 30 } 31 maxpos += pos[i]; 32 maxneg += neg[i]; 33 } 34 cout << maxneg << " " << maxpos << endl; 35 }
C.http://codeforces.com/contest/1215/problem/C
这道题也是,贪心想到了(而且很好想),但是情况没处理好,当ab和ba的情况加起来是奇数的时候输出-1,不然一定有解;
当时以为ab和ba都为奇数的时候还需要一个aa或者bb来做媒介,但其实不用,ab可以自己交换,然后再跟ba交换,花费两次。
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e6; 4 5 int vis[maxn]; 6 char a[maxn], b[maxn]; 7 8 int main() 9 { 10 int n; cin >> n; 11 int same, ab, ba; 12 vector<int> resa, resb; 13 14 same = ab = ba = 0; 15 scanf("%s%s", a + 1, b + 1); 16 for (int i = 1; i <= n; i++) 17 { 18 vis[i] = a[i] == b[i] ? 1 : a[i] == ‘a‘ ? 2 : 3; 19 if (vis[i] == 1) 20 continue; 21 else if (vis[i] == 2) 22 resa.push_back(i); 23 else resb.push_back(i); 24 } 25 if ((resa.size() + resb.size()) & 1) return cout << -1 << endl, 0; 26 printf("%d\n", resa.size() / 2 + resb.size() / 2 + (resa.size() % 2 ? 2 : 0)); 27 for (int i = 1; i < resa.size(); i += 2) 28 printf("%d %d\n", resa[i - 1], resa[i]); 29 for (int i = 1; i < resb.size(); i += 2) 30 printf("%d %d\n", resb[i - 1], resb[i]); 31 if (resa.size() % 2) 32 { 33 printf("%d %d\n", resa[resa.size() - 1], resa[resa.size() - 1]); 34 printf("%d %d\n", resb[resb.size() - 1], resa[resa.size() - 1]); 35 } 36 }
原文地址:https://www.cnblogs.com/liuwenhan/p/11526711.html
时间: 2024-11-11 00:36:43