56ptsWA求调,回复必关
查看原帖
56ptsWA求调,回复必关
305735
Jean_Gunnhildr楼主2024/11/28 16:03
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e5+5;

int zsq,n,m,k,tmp,ou[N],ji[N],minn[N];
//ou[i]表示第i轮选偶数的损失,如果选偶数赚钱的话值为负数,ji[i]存选奇数 
 
//Even 偶数
//Odd 奇数
//Even的字典序小于Odd 

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>zsq;
	while(zsq--){
		cin>>n>>m>>k;
		for(int i=1;i<=m;i++){
			int oumin=0x3f3f3f3f,jimin=0x3f3f3f3f,oumax=0,jimax=0;
			for(int j=1;j<=k;j++){
				cin>>tmp;
				if(tmp&1){//奇数 
					jimin=min(jimin,tmp);
					jimax=max(jimax,tmp);
				}
				else{//偶数 
					oumin=min(oumin,tmp);
					oumax=max(oumax,tmp);
				}
			}
			ji[i]=oumax;
			ou[i]=jimax;
			if(oumax==0){
				ji[i]=-jimin;
			}
			if(jimax==0){
				ou[i]=-oumin;
			}
			//minn[i]=min(ou[i],ji[i]);
		}
		minn[m+1]=0;
		for(int i=m-1;i>=1;i--) minn[i]=max(0ll,min(ou[i],ji[i])+minn[i+1]);//防止选择时以为可以赚回来 
		
		bool can=true;
		vector<int> ans;//0代表选偶数,1代表选奇数 
		for(int i=1;i<=m;i++){
			if(ou[i]+minn[i+1]<n){
				ans.push_back(0);
				n-=ou[i];
			}
			else if(ji[i]+minn[i+1]<n){
				ans.push_back(1);
				n-=ji[i];
			}
			else{
				can=false;
				break;
			}
		}
		if(!can) cout<<"-1";
		else{
			for(int i:ans){
				if(!i) cout<<"Even ";
				else cout<<"Odd ";
			}
		}
		cout<<"\n";
	}
	return 0;
}

2024/11/28 16:03
加载中...