求助月赛T2
  • 板块题目总版
  • 楼主Terraria
  • 当前回复31
  • 已保存回复31
  • 发布时间2020/10/6 21:04
  • 上次更新2023/11/5 11:46:23
查看原帖
求助月赛T2
289275
Terraria楼主2020/10/6 21:04

蒟蒻先提前说明一下:

我不会什么田忌赛马!听都没听过!

于是在这样的背景下,我写下了一串丑陋的代码;

先申明,本贴用意为:

  • 请大佬帮忙看下思路是否有问题

  • 我知道时间复杂度绝对T飞,求是否能优化,若能又该怎么优化

  • 若我的思路有误请指出,最好能提出方案(这是我第一次写100多行代码。。)

  • 若我的代码实在是没救请说说你们的思路(希望不要再田忌赛马什么的了)

最后——

Code:

/*
前言:请各位大佬看看我的代码和大致思路是否正确(我知道我的思路是错的)
也希望有大佬能回复说您的AC思路 
*/ 
#include<bits/stdc++.h>
using namespace std;
struct person{
	int huase;//花色 
	int num;//其值 
	int vis=false;//先默认还没有使用,即false
}d[100009];
/*
思路(贪心):对于每一次出牌,都有出或不出的选择;
一、若要出牌,首先要有花色相同的牌
    为了不输,应该每次取花色相同时大于等于b的数中最小的第i张牌为后面打好铺垫 
二、如果不出牌,则被对面拿走c颗糖后(较亏),所以除非没有合适的花色,就不可能不出牌(样例#2帮我验证了这个思路是错的,望指教!) 
	我又想了一下:要不就将这两个进行比较吧!
	能出牌毫无疑问是下面的思路;
	那不能出牌时,分为:
		1.出花色相同而D的牌小于b的最小值对应的第i张牌
		2.没有花色根本出不了牌 
		3.最后的candy取最大值
	然而#2再次反驳了我的观点。。。(越看越像dp,但是直觉告诉我这“可能”只是个纯模拟。。。) 
	我已绞尽脑汁。。 
*/ 
int candy;
int n,m,c,v;
int ans[100009],nnow=1;
int main(){
	cin>>n>>m>>c>>v;
	for(int i=1;i<=n;i++) cin>>d[i].huase>>d[i].num;
	candy=v;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;//小C出了花色为a,其值为b的牌 
		int cha=0x7f7f;//自己出的牌与小C的牌的差 
		int now=0;
		bool hua=false;//先默认目前没有合适的花色
		bool has=false;//在有合适的花色下是否有其值大于等于b的牌 
		//接下来判断的是是否有满足可以使自己稳赚不赔(有相同花色的情况下其值最小) 
		for(int j=1;j<=n;j++){//枚举小d的牌 
			if(d[j].huase==a&&!d[j].vis){//花色相同且还没使用则选牌 
				hua=true;//已有合适的花色 
				if(b<=d[j].num&&!d[j].vis){//其值足够
					has=true;//有牌了; 
					if(cha>d[j].num-b){
						cha=d[j].num-b;
						now=j;
					}
				}
			}
		}
		//接下来是我对尝试着对不出牌情况的一个整理,然而并没用。。 
		//int cha2=-1;
		//int candy1=candy-c;
		//int candy2=candy;
		//int noww;
		/*for(int i=1;i<=n;i++){//枚举小D的牌
			if(a>=d[i].num){
				if(d[i].huase==a&&!d[i].vis&&cha2<a-d[i].num){
					candy2=candy2-c+d[i].num;
					noww=i;
				}
			}
		}
		if(candy1>candy2){
			candy=candy1;
			ans[nnow]=-1;
			nnow++;
		}
		else{
			ans[nnow]=noww;
			nnow++;
			candy=candy2;
			d[noww].vis=true;
		}*/
		if(!hua){//没有合适的花色,即没有出牌 
			candy=candy-c;
			ans[nnow]=-1;
			nnow++;
		}
		if(hua&&!has){//如果出了牌但是没有其值大于b的牌 
			for(int i=1;i<=n;i++){//枚举小D的牌 
				if(d[i].huase==a&&!d[i].vis){
					ans[nnow]=i;
					nnow++;
					candy=candy-c+d[i].num;
					d[i].vis=true;
				}
			}
		}
		if(hua&&has){//已有合适的花色,则选了牌,就要进行操作 
			if(has){//合适的与a花色相同且其值大于b的牌 
				candy=candy+c+d[now].num;
			}
			d[now].vis=true;//已使用 
			ans[nnow]=now;
			nnow++;
		}
		//cout<<now<<endl;
		
	}
	cout<<candy<<endl;
	for(int i=1;i<nnow;i++) cout<<ans[i]<<endl;
	return 0;
}
//后语:我太菜了,连T2都过不了。
//写了那么多,望多多指教qwq!谢谢! 

感谢各位大佬!

2020/10/6 21:04
加载中...