Codeforces 733C:Epidemic in Monstropolis(暴力贪心)
http://codeforces.com/problemset/problem/733/C
题意:给出一个序列的怪兽体积 ai,怪兽只能吃相邻的怪兽,并且只有体积严格大于相邻的怪兽才能吃,吃完之后,这只怪兽的体积会变成原体积 + 吃的怪兽的体积,接下来给出 k 个怪兽的体积 bi,问能不能满足经过一系列操作后让剩下的怪兽体积变得满足下面的序列。
思路:昨晚想的时候觉得好复杂,今天补题发现实际上只有一种情况,就是每一个区间里的怪兽体积对应于一个 bi,然后拆成 k 个区间,分别找区间里面最大的去吃小的,这里可能有同时多个最大的,分别对每一种情况进行枚举,看可不可以让这个区间剩下一只怪兽,如果可以就进行下一个区间的操作,不行的话答案一定是不行的,因为前面不满足,后面就算满足了也没用。记得判一下最后分得的区间数是否刚好等于 k,在第104个test(如下)错了一发。 我觉得自己在CF或者BC中很容易给自己定个档次,就是如果AC人数不超过多少个,我觉得自己就做不出这题(难度大),但是其实这道题是完全可以弄出来的,只不过很可能卡在这104样例过不去。以后应该更加耐心,沉着,勇于挑战,不要那么浮躁。不然这样进步肯定是不大的。永远落在后面。
2 1 2 2 3 1
1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 #include <string> 6 #include <cmath> 7 #include <queue> 8 #include <vector> 9 using namespace std; 10 #define N 505 11 #define INF 0x3f3f3f3f 12 int sum[N], d[N], b[N], a[N], n; 13 typedef pair <int, int> P; 14 vector<P> out[N]; 15 vector<int> vec[N]; 16 vector<int> big, tmp; 17 18 int check(int i) // 判断这个区间满足与否 19 { 20 if(sum[i] == b[i]) return 0; 21 else if(sum[i] < b[i]) return -1; 22 else return 1; 23 } 24 25 bool solve(int x) // 有了区间对这个区间进行判断是否可以组成 b[x] 26 { 27 for(int i = 1; i <= n; i++) a[i] = d[i]; 28 int cnt = 0; 29 int ma = 0; 30 big.clear(); 31 int n = vec[x].size(); 32 for(int i = 0; i < n; i++) { 33 int id = vec[x][i]; 34 if(a[id] > ma) ma = a[id]; 35 } 36 for(int i = 0; i < n; i++) { 37 int id = vec[x][i]; 38 if(ma == a[id]) big.push_back(id); 39 } 40 int m = big.size(); 41 int l = vec[x][0], r = vec[x][n-1], L, R; 42 for(int i = 0; i < m; i++) { 43 L = l, R = r; 44 tmp.clear(); 45 out[x].clear(); 46 for(int j = 0; j < n; j++) tmp.push_back(vec[x][j]); 47 int bb = big[i]; 48 bool flag = 1; 49 while(L < R && flag) { 50 // printf("bbbbb: %d\n", bb); 51 if(bb > L) { 52 if(a[bb] > a[bb-1]) { 53 // printf("bb :%d\n", bb); 54 a[bb-1] += a[bb]; 55 out[x].push_back(make_pair(bb, 0)); 56 // printf("LLL\n"); 57 bb--; 58 for(int i = bb + 2; i <= R; i++) a[i-1] = a[i]; 59 R--; 60 // printf("%d %d\n", L, R); 61 continue; 62 } 63 } 64 if(bb < R) { 65 if(a[bb] > a[bb+1]) { 66 // printf("bb :%d\n", bb); 67 a[bb] += a[bb+1]; 68 for(int i = bb + 2; i <= R; i++) a[i-1] = a[i]; 69 out[x].push_back(make_pair(bb, 1)); 70 // printf("RRR\n"); 71 R--; 72 // printf("%d %d\n", L, R); 73 continue; 74 } 75 } 76 flag = 0; 77 } 78 if(flag) return true; 79 } 80 return false; 81 } 82 83 int main() 84 { 85 scanf("%d", &n); 86 for(int i = 1; i <= n; i++) scanf("%d", &d[i]); 87 int k; 88 scanf("%d", &k); 89 for(int i = 1; i <= k; i++) scanf("%d", &b[i]); 90 int j = 1, now = 0; 91 bool f = 1; 92 for(int i = 1; i <= n; i++) { 93 sum[j] += d[i]; 94 vec[j].push_back(i); 95 if(check(j) == 0) { 96 if(!solve(j)) { 97 f = 0; break; 98 } 99 j++; 100 } else if(check(j) == 1) { 101 f = 0; 102 break; 103 } 104 } 105 if(!f || j != k + 1) puts("NO"); 106 else { 107 puts("YES"); 108 int sum = 0; 109 for(int i = 1; i <= k; i++) { // 因为前面的被吃了,后面的要挤到前面去,所以减sum 110 int sz = out[i].size(); 111 for(int j = 0; j < sz; j++) { 112 int x = out[i][j].first - sum, y = out[i][j].second; 113 printf("%d %c\n", x, y == 0 ? 'L' : 'R'); 114 } 115 sum += sz; 116 } 117 } 118 return 0; 119 }