社区讨论
求调,满江红!!!
P8874[传智杯 #5 初赛] F-二人的大富翁游戏参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjd1qv2
- 此快照首次捕获于
- 2025/11/04 00:34 4 个月前
- 此快照最后确认于
- 2025/11/04 00:34 4 个月前
直接上代码:
CPP#include <bits/stdc++.h>
using namespace std;
int n,o,q,l; //格子数、初始资金、回合次数和建筑物等级上限
int c[110][110]; //钱,c[i][0]:搭建筑物的钱,i是当前格,c[i][j]:升级,j是当前等级
int d[110]; //格子,圆环数组
int a[110]; //资金
long long renko,merry; //莲子和梅莉的钱
int jz[110]={0}; //跟a数组同步,代表莲子的建筑
int jz1[110]={0}; //代表梅莉的建筑
bool b=false; //判断是否已经输出
int dj[110]={0};
void jq(int s,int c,int i); //a表示走几步,交钱,用c可以求出当前行动者:是二的倍数就是梅莉
void sj(int j,int e,int i); //升级,a[i]要变,还要花钱,并且没有建筑得建
void syjfx(); //输赢提示,一旦有人输了就输出但不结束代码
void yhh(); //一回合结束了,建筑物提供资金
void syjfx1(); //有点多余,但有用,是末尾判断两者是否打平的
int main(){ //正式开始,qwq....
cin>>n>>o>>q>>l;
renko=merry=o;//莲子和梅莉的初始资金
int r=1,m=1; //代表当前两人分别走到了第几格
int x,y;//后来的输入
int count=1; //用来计算当前人
for(int i=1;i<=n;i++){
for(int j=0;j<l;j++){
cin>>c[i][j];//输入钱
}
}
for(int i=1;i<=n;i++){
cin>>d[i];
}
while(cin>>x>>y){
if(b) break;
if(x==1){ //走格子
if(count%2==0){//当前人是梅莉
m=(m+y-1)%n+1;
jq(y,count,(m - y + n) % n + 1);//记得交钱
}else{
r=(r+y-1)%n+1;
jq(y,count,(r - y + n) % n + 1);//莲子
}
syjfx(); //输赢是否见分晓
}else if(x==2){ //一回合结束
yhh();
if(count%2==0){
if(dj[m]+y>l){
sj(dj[m]-l,count,m);
}else{
sj(y,count,m);
}
}else{
if(dj[r]+y>l){
sj(dj[r]-l,count,r);
}else{
sj(y,count,r);
}
}
count++;
}
}
syjfx1();
return 0;
}
void syjfx1(){
if(renko>=0&&merry>=0){
cout<<renko<<" "<<merry;//如果没有人的钱是负数,就返回
}else if(renko<0){
cout<<"Renko"<<endl;//莲子输
}else if(merry<0){
cout<<"Merry"<<endl;//梅莉输
}
}
void syjfx(){
if(renko>=0&&merry>=0){
return;//如果没有人的钱是负数,就返回
}else if(renko<0){
cout<<"Renko"<<endl;//莲子输
b=true;
}else if(merry<0){
cout<<"Merry"<<endl;//梅莉输
b=true;
}
}
void yhh(){
for(int i=1;i<=n;i++){
if(jz[i]==1){//这里有莲子的建筑
renko+=d[i];
}else if(jz1[i]==1){//这里有梅莉的建筑
merry+=d[i];
}
}
}
void sj(int j,int e,int i){
if(e%2==0){//当前行动方是梅莉
if(jz[i]==1) return;//这里有对方建筑
if(jz1[i]==0){
if(merry<c[i][0]) return;
merry-=c[i][0];
jz1[i]=1; //起地基
j--; //起地基也相当于一级
a[i]=c[i][0];//a[i]初始化
dj[i]=1;//这个建筑级别上升
}
while(j>0&&dj[i]<l){
if(merry<c[i][dj[i]]) break;
merry-=c[i][dj[i]];
a[i]+=c[i][dj[i]];
dj[i]++;
j--;
}
}else{
if(jz1[i]==1) return;
if(jz[i]==0){
if(renko<c[i][0]) return;
renko-=c[i][0];
jz[i]=1; //起地基
j--; //起地基也相当于一级
a[i]=c[i][0];//a[i]初始化
dj[i]+=1;//这个建筑级别上升
}
while(j>0&&dj[i]<l){
if(renko<c[i][dj[i]]) break;
renko-=c[i][dj[i]];
a[i]+=c[i][dj[i]];
dj[i]++;
j--;
}
}
}
void jq(int s,int h,int i){//a表示走几步,交钱,用c可以求出当前行动者:是二的倍数就是梅莉
for(int k=0;k<s;k++){
int j=(i+k-1)%n+1;
if(h%2==0){ //当前行动人是梅莉
if(jz1[j]==1){
merry+=a[j];
}else if(jz[j]==1){
if(merry<a[j]){
merry=-1;
return;
}
merry-=a[j];
renko+=a[j];
}
}else{
if(jz[j]==1){
renko+=a[j];
}else if(jz1[j]){
if(renko<a[j]){
renko=-1;
return;
}
renko-=a[j];
merry+=a[j];
}
}
}
}
大佬帮忙看看吧,回复记得cue我,必关
回复
共 2 条回复,欢迎继续交流。
正在加载回复...