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;
}

 

posted @ 2020-11-27 14:46  andyc_03  阅读(104)  评论(0编辑  收藏  举报