你在动物收容所工作,负责喂养动物。
你一共准备了 D 份狗粮和 C 份猫粮。一共有 N 只动物排队等候用餐,有的是狗,有的是猫。当然,也有可能全都是狗或者全都是猫。
我们可以用一个长度为 N 的由大写字母 C 和 D 组成的字符串 S 来表示队列中猫狗的顺序。
如果队列中第 i 只动物是猫,则第 i 个字符为 C。如果队列中第 i 只动物是狗,则第 i 个字符为 D。
动物们严格按照排队顺序依次进食。每只狗吃一份狗粮,每只猫吃一份猫粮。
此外,你还有额外的猫粮。每当一条狗吃完一份狗粮,你就会为猫多提供 M 份猫粮。
每只动物都只会在排在其前面的所有动物都进食完毕后,才肯进食。这也就意味着,当轮到某只动物进食,但是却没有相应的食物时,它和排在它后面的所有动物都会因此无法进食。
请问,在这种情况下,队列中的所有狗能否都得到喂食。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<iostream> #include<queue> using namespace std;
int main() { int T; cin>>T; for(int t=1;t<=T;t++) { int N,D,C,M; string s; scanf("%d%d%d%d",&N,&D,&C,&M); cin>>s; queue<int> q; int cat=0; for(int i=0;i<s.length();i++) { if(s[i]=='D') q.push(cat),cat=0; else cat++; } bool flag=true; while(!q.empty()) { if((C-q.front())>=0&&D>=1) { D--; C+=M; C-=q.front(); q.pop(); }else { flag=false; break; } } if(flag) printf("Case #%d: YES\n",t); else printf("Case #%d: NO\n",t); } return 0; }
|