社区讨论

求调,满江红!!!

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 条回复,欢迎继续交流。

正在加载回复...