1 solutions
-
0
#include<iostream> using namespace std; int f[10005]; int main(){ int num=8; //最初有八位备战席,用num来记录当前备战席的情况 for(int i=0;i<8;++i){ int q; cin>>q; f[q]++; //装桶的方式把战棋放进去统计拥有的数量,也就是用数组名代表元素,比如读入2,那么f[2]就从0变成1,如果再读就是变成2,代表了一共有几个2 } int n; cin>>n; for(int i=1;i<=503;++i){ //先把备战席已有的提前合成了,不然会出现1 1 1 1 1 1 1 1 (2)读不进去的情况,实际上是能读进去的,因为1 1 1会提前合成,然后备战席空出来就能读进去了 while(f[i]>=3){ //有可能f[i]最开始大于等于6之类的,这种情况下就要用while来让他合成两个两星 f[i]-=3;//三个同样的合成一个高品质,这会让三个低品质的消失 f[i*10]++;//通过观察题目的一星两星三星之间的关系可以得出,比如三个2合成为20,我们只需要让f[2]-=3,f[2*10]++,就能实现,也就是三个2消失,一个20增加了 num-=2;//因为三个同样的消失,然后出现了一个新的高品质,所以num先减3后加一,也就是减二就行 } } for(int i=0;i<n;++i){ int k; cin>>k; if(num<=7){//因为上面清理过最开始的数据,所以每次循环读入,只要num小于8就读入 f[k]++;//装桶 num++;//让备战席加一 while(f[k]>=3){//防止1 1 2 2 3 3 4 4 (1 2 3 5 5 5)卡住 //连续清除备战席 f[k]-=3; f[k*10]++; num-=2;//这三步的解释与上面同理 } } else if(num==8&&f[k]>=2){//备战席为8的情况下且有两张相同牌,第三张是同一张的情况,例如(1 1 2 2 3 3 4 4)(4) f[k]-=2;//把这两张删除 f[k*10]++;//获得一张更强的牌 num=7;//备战席变成7 } } for(int i=1;i<=503;++i){//把所有的都合成了 while(f[i]>=3){ f[i]-=3; f[i*10]++;//此时不需要对num进行操作了,没意义 } } int ans=0; for(int i=503;i>=1;--i){//倒着查询桶的情况,只要某个桶里面有数字,那么这个数字就是最大的那个战力 if(f[i]){//f[i]不是0就能进入这个if ans=i; break; } } int m; cin>>m; if(ans>=m) cout<<"YES YES YES"; else cout<<"NO NO NO"; return 0; }
- 1
Information
- ID
- 6694
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 25
- Accepted
- 6
- Uploaded By