WA、RE求助
查看原帖
WA、RE求助
649445
wuyuchen5001143楼主2022/12/4 22:45
#include <stdio.h>
using namespace std;
int n,m,q,l;
struct dfw
{
	int w,s,l;//w是价值,s是属于谁,l是等级
};
int main()
{
	scanf("%d%d%d%d",&n,&m,&q,&l);
	int c[n+1][l+1]={0},d[n+1]={0};
	dfw a[n+1];
	for(int i=1;i<=n;i++) for(int j=0;j<l;j++) scanf("%d",&c[i][j]);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&d[i]);
		a[i].w=0;
		a[i].s=0;
		a[i].l=0;
	}
	int z,k,o=-1,u=0,s1=m,s2=m,f1=1,f2=1;//z,k是输入的参数,o是行动方,u是判断回合结束的标志,s1,s2是双方的金钱,f1,f2是双方所处的位置
	while(q)
	{
		scanf("%d%d",&z,&k);
		if(z==1)
		{
			o*=-1;//行动方转换
			if(!u) for(int i=1;i<=n;i++)
			{
				if(a[i].s==1) s1+=d[i];
				if(a[i].s==2) s2+=d[i];
			}//如果回合结束计算建筑物给予的加钱
			u++;
			if(u==2)//过了一回合的标志
			{
				u=0;
				q--;
			}
        //计算双方前进到达的位置,如果到达建筑物是对方的,则扣除对方建筑物的价值
			if(o==1) 
			{
				f1=(f1+k)%n;
				if(a[f1].s==2) s1-=a[f1].w;
			}
			else
			{
				f2=(f2+k)%n;
				if(a[f2].s==1) s2-=a[f2].w;
			}
		}
		else
		{
        //判断:如果k>0且所有的钱比要升级需要的钱大且当前建筑物是无主或已经是行动方的且当前建筑物等级小于最大等级,就升级
        //升级:行动方金钱减去升级所需的钱,当前建筑物所属方改为行动方,当前建筑物的价值加上升级所耗的钱,当前建筑物等级+1
			if(o==1)
			{
				while(k--&&s1>=c[f1][a[f1].l]&&(a[f1].s==0||a[f1].s==1)&&a[f1].l<l)
				{
					s1-=c[f1][a[f1].l];
					a[f1].s=1;
					a[f1].w+=c[f1][a[f1].l];
					a[f1].l++;
				}
			}
			else
			{
				while(k--&&s2>=c[f2][a[f2].l]&&(a[f2].s==0||a[f2].s==2)&&a[f2].l<l)
				{
					s2-=c[f2][a[f2].l];
					a[f2].s=2;
					a[f2].w+=c[f2][a[f2].l];
					a[f2].l++;
				}
			}
		}
     //每次行动过程中不会获得钱,所以直接在每次行动结束判断是否有人成为输家,如果有,输出输家
		if(s1<0)
		{
			printf("Renko\n");
			return 0;
		}
		if(s2<0)
		{
			printf("Merry\n");
			return 0;
		}
	}
   //如果所有回合结束没有分出胜负,按顺序输出两人的金钱
	printf("%d %d\n",s1,s2);
	return 0;
}
2022/12/4 22:45
加载中...