社区讨论
WA、RE求助
P8874[传智杯 #5 初赛] F-二人的大富翁游戏参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo7ecqmp
- 此快照首次捕获于
- 2023/10/27 00:26 2 年前
- 此快照最后确认于
- 2023/10/27 00:26 2 年前
CPP
#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;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...