这个题本身描述应该是不清的,让别人全靠数据瞎摸索的小屁孩题。
并不是每个随从都激发一次免费技能,而是这一回合本方死了任意个随从激发一次,对方死了任意个随从激发一次。
#include<bits/stdc++.h> using namespace std; int m,n,q,mv[9],nv[9]; void read(){ cin>>m>>n>>q; for(int i=0;i<m;i++){ cin>>mv[i]; } for(int i=0;i<n;i++){ cin>>nv[i]; } } bool math(){ int mp=0,np=0; //最小值所在下标 int cnt=0; //技能+免费技能 sort(mv,mv+m); //排序易于计算 sort(nv,nv+n); while(q>0&&np<n){ //还有技能并且还没打败 q--; //开一下头 int cur=1; //本次用了多少个技能(+免费) for(int i=1;i<=cur;i++){ //用到没了 if(mv[mp]-cnt-i==0){ //减没了一个 cur++; //增加一次 mp++; //减下一个 } if(nv[np]-cnt-i==0){ cur++; np++; } } cnt+=cur; //本次产生的技能数 cout<<cnt<<"--"<<np<<endl; } return nv[n-1]<=cnt; //对方全灭 } int main(){ int t; cin>>t; while(t--){ read(); if(math()){ cout<<"Legendary"<<endl; }else{ cout<<"GG"<<endl; } } return 0; }
从AC代码逻辑可以看出,是当这个随从的血量减去过去的减血和当前的连续减血==0时,所以当一群随从都是1时,第二个随从在计算时该值<0,白死而已。
如果按题面描述,不分敌我,死了一个激活一次免费技能,那么下面的代码应该可以正确工作:
bool math(){ int p=0; sort(v+1,v+x+1); //排序易于计算 for(p=1;p<=x;p++){ if(v[p]<=q){ q++; } } return v[n-1]<=q; //对方全灭 }
如果不分阵营只激发一次,那么下面代码可以AC:
bool math(){ int p=0; sort(v+1,v+x+1); //排序易于计算 for(p=1;p<=x;p++){ if(v[p]<=q && v[p]!=v[p-1]){ q++; } } return v[n-1]<=q; //对方全灭 }
事实是什么呢?
出题如戏,全靠演技,数据入海,全都靠猜。