CSP/NOIP新赛制内部挑战赛2 B. 战旗
一个大模拟!!!
这个鱼人领军不是每一轮都加的,而是每场比赛!!
代码
#include<bits/stdc++.h> using namespace std; int n,x,A,B,C; struct person { int hp,atk; int type; int spe; }a[55],b[55],ga[55],gb[55]; int getid() { return x=(x*A+B)%C; } int alivea[55],aliveb[55],ca,cb,sa,sb; void init() { ca=0; cb=0; int ta=0,tb=0; for(int i=1;i<=n;i++) { if(ga[i].spe==1 && !alivea[i]) ta++; if(gb[i].spe==1 && !aliveb[i]) tb++; } for(int i=1;i<=n;i++) { if(!ga[i].type) ga[i].atk+=(ta-(ga[i].spe==1))*20; if(!gb[i].type) gb[i].atk+=(tb-(gb[i].spe==1))*20; } } void attack() { int pa=getid()%sa+1; int pb=getid()%sb+1; int p1,p2; for(p1=1;p1<=n,pa;p1++) { if(!alivea[p1]) pa--; if(!pa) break; } for(p2=1;p2<=n,pb;p2++) { if(!aliveb[p2]) pb--; if(!pb) break; }//找到对决的两人 ca=0; cb=0; for(int i=1;i<=n;i++) { if(ga[i].spe==3 && !alivea[i] && i!=p1) ca++; if(gb[i].spe==3 && !aliveb[i] && i!=p2) cb++; } if(ga[p1].type) ga[p1].atk+=20*ca,ga[p1].hp+=20*ca; if(gb[p2].type) gb[p2].atk+=20*cb,gb[p2].hp+=20*cb; //处理海盗队长 ga[p1].hp-=gb[p2].atk; gb[p2].hp-=ga[p1].atk; if(ga[p1].hp<=0) { sa--; alivea[p1]=1; if(ga[p1].spe==2) { for(int i=1;i<=n;i++) if(!ga[i].type && !alivea[i]) ga[i].atk+=20,ga[i].hp+=20; }//鱼人国王 if(ga[p1].spe==1) { for(int i=1;i<=n;i++) if(!ga[i].type && !alivea[i]) ga[i].atk-=20; }//鱼人领军 if(ga[p1].type==1) { for(int i=1;i<=n;i++) if(ga[i].spe==4 && !alivea[i]) ga[i].atk+=50; }//海盗之魂 } if(gb[p2].hp<=0) { sb--; aliveb[p2]=1; if(gb[p2].spe==2) { for(int i=1;i<=n;i++) if(!gb[i].type && !aliveb[i]) gb[i].atk+=20,gb[i].hp+=20; }//鱼人国王 if(gb[p2].spe==1) { for(int i=1;i<=n;i++) if(!gb[i].type && !aliveb[i]) gb[i].atk-=20; } //鱼人领军 if(gb[p2].type==1) { for(int i=1;i<=n;i++) if(gb[i].spe==4 && !aliveb[i]) gb[i].atk+=50; }//海盗之魂 } } int game() { memset(alivea,0,sizeof(alivea)); memset(aliveb,0,sizeof(aliveb)); sa=n,sb=n; init(); while(sa && sb) { attack(); } if(!sa) return 0; if(!sb) return 1; } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); scanf("%d%d%d%d%d",&n,&x,&A,&B,&C); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].atk,&a[i].hp); getchar(); char cc=getchar(); if(cc=='M') a[i].type=0; else a[i].type=1; getchar(); cc=getchar(); if(cc=='B') a[i].spe=0; if(cc=='L') a[i].spe=1; if(cc=='K') a[i].spe=2; if(cc=='C') a[i].spe=3; if(cc=='G') a[i].spe=4; } for(int i=1;i<=n;i++) { scanf("%d%d",&b[i].atk,&b[i].hp); getchar(); char cc=getchar(); if(cc=='M') b[i].type=0; else b[i].type=1; getchar(); cc=getchar(); if(cc=='B') b[i].spe=0; if(cc=='L') b[i].spe=1; if(cc=='K') b[i].spe=2; if(cc=='C') b[i].spe=3; if(cc=='G') b[i].spe=4; } int ansa=0,ansb=0; for(int i=1;i<=500;i++) { for(int i=1;i<=n;i++) { ga[i].atk=a[i].atk; gb[i].atk=b[i].atk; ga[i].hp=a[i].hp; gb[i].hp=b[i].hp; ga[i].type=a[i].type; gb[i].type=b[i].type; ga[i].spe=a[i].spe; gb[i].spe=b[i].spe; } if(game()) ansa+=sa; else ansb+=sb; } printf("%d %d",ansa,ansb); return 0; }