标签:
//思路:因为题目是要求求出所有可能被选完的 dish,所以当之前乘客所选 dish 不确定时,将所有 dish 的数量均减一(做法是记录下来不确定的 dish 的数量);当出现第一个顾客 QAQ(不开心) 的时候,说明在他之前至少有一个 dish 已经被选完了,这时候就需要利用不确定的 dish 的数量优先构造出一个被选完的 dish(注意到之后被选择的 dish 一定不能再此刻被选完)
//感觉这题要是题目读懂了就没什么难度了......弱渣这题读了好半天 Orz
1 #include "bits\stdc++.h" 2 using namespace std; 3 int T; 4 int m, n; 5 int cnt[100005], cnt_pre[100005], sum, sum_pre, res[100005]; 6 bool dish_pre[100005]; 7 8 int main() 9 { 10 int i; 11 scanf("%d", &T); 12 while(T--) { 13 sum = sum_pre = 0; 14 memset(dish_pre, 1, sizeof(dish_pre)); 15 memset(res, 0, sizeof(res)); 16 scanf("%d%d", &m, &n); 17 for(i = 1; i <= n; ++i) { 18 scanf("%d", &cnt[i]); 19 cnt_pre[i] = cnt[i]; 20 } 21 int dish, QAQ; 22 bool stop = 0; 23 for(i = 1; i <= m - 1; ++i) { 24 scanf("%d%d", &dish, &QAQ); 25 if(dish) 26 --cnt[dish]; 27 else 28 ++sum; 29 if(stop) { 30 dish_pre[dish] = 0; 31 continue; 32 } 33 if(QAQ) { 34 dish_pre[dish] = 0; 35 stop = 1; 36 continue; 37 } 38 if(dish) 39 --cnt_pre[dish]; 40 else 41 ++sum_pre; 42 } 43 44 if(stop) { 45 int rem = 0; 46 for(i = 1; i <= n; ++i) { 47 if(dish_pre[i] && cnt_pre[i] <= sum_pre) { 48 res[i] = 1; 49 rem = max(rem, sum - cnt_pre[i]); 50 } 51 } 52 53 for(i = 1; i <= n; ++i) { 54 if(cnt[i] <= rem) { 55 res[i] = 1; 56 } 57 } 58 } 59 else { 60 for(i = 1; i <= n; ++i) { 61 res[i] = cnt[i] <= sum; 62 } 63 } 64 65 for(i = 1; i <= n; ++i) { 66 putchar(res[i]? ‘Y‘: ‘N‘); 67 } 68 puts(""); 69 } 70 }
Codeforce 522C - Chicken or Fish? 模拟
标签:
原文地址:http://www.cnblogs.com/AC-Phoenix/p/4373125.html