站外题求助
  • 板块学术版
  • 楼主Expert_Dream
  • 当前回复27
  • 已保存回复27
  • 发布时间2023/10/5 07:47
  • 上次更新2023/11/2 15:37:49
查看原帖
站外题求助
768530
Expert_Dream楼主2023/10/5 07:47

https://cdn.luogu.com.cn/upload/image_hosting/ldyy3ih4.png

本人试图用贪心解决这一道题,但是贪心已经贪到了极端的情况下了,举不出反例,站外评测结果是WA70,望各位大佬帮忙调一下或者举出一个反例,谢谢。

如对代码思路不理解的可以私信,谢谢!! 代码丑陋,不喜勿喷。。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
int t;
int mx(string s,string t){//大于1,小于0,等于2 
	for(int i = 0;i < s.size();i++){
		if(s[i]>t[i]) return 1;
		else if(s[i]<t[i])return 0;
	}
	return 2;
}
bool check(string s){
	for(int i =0  ;i < s.size();++i){
		if(s[i]!='4' && s[i]!='7')return false;
	}return true;
}
int main(){
	cin >> t;
	while(t--){
//		cout<<"test:"<<t<<endl;
		string s;
		cin >> s;
		int n=s.size();
		
		int a4=0,a7=0;
		for(int i = 0 ;i < n;i++){
			if(s[i]=='4')a4++;
			else a7++;
		}
		if(a4==a7&&check(s)){
			cout<<s<<endl;
		}
//		cout<<n<<endl;
		else if(n&1){
//			cout<<"进入if判断2\n";
			n++;
//				cout<<"输出:";
			for(int i =1;i <= n/2;i++)cout<<4;
			for(int i =1;i <= n/2;i++)cout<<7;
			cout<<endl;
		}
		else if(a4-a7>0&&check(s)){
//			cout<<"进入if判断1\n";
//			if(a4-a7 < 0){
//				n+=2;
//				for(int i =1;i <= n/2;i++)cout<<4;
//				for(int i =1;i <= n/2;i++)cout<<7;
//				cout<<endl;	
//				continue;				
//			}
			int ax=(a4-a7)/2;
			for(int i = n-1;i >= 0 && ax;i--){
				if(s[i]=='4')s[i]='7',ax--;
			}
//			cout<<"输出:";
			cout<<s<<endl;
		}
		else{
//			cout<<"进入if判断3\n";
			string t;
			for(int i=1;i<=n/2;i++)t+='7';
			for(int i=1;i<=n/2;i++)t+='4';
			int p=mx(s,t);
			if(p==2) {
//				cout<<"相等\n";
//				cout<<"输出:"; 
				cout<<s<<endl;
			}
			else if(p==1){
//				cout<<"进入p==1\n";
				n+=2;
				for(int i =1;i <= n/2;i++)cout<<4;
				for(int i =1;i <= n/2;i++)cout<<7;
				cout<<endl;			
			}else{
//				cout<<"进入p==1\n";
				string ans;
//				cout<<"计算最优情况,记录4\n";
				for(int i =0;i < n;i++){
					if(s[i]>'4') ans+='7';
					else if(s[i]=='4'){
						int flag=0;
						int j=i+1;
						while(j<n){
							if(s[j]>'7'){
								flag=1;
								break; 
							}else if(s[j]<'7') break;
							j++;
						}
						if(flag||(j==n && s[j-1]=='7')) ans+='7';
						else ans+='4';
					}else{
						ans+='4';
					}
//					cout<<"i=="<<i<<" ans="<<ans<<endl;
					if(ans[i] > s[i]){
//						cout<<"跳过后面部分,直接取4\n";
						for(int j  = i+1;j<n;j++)ans+='4'; 
						break;
					}
				}
//				cout<<"取4最多情况:"<<ans<<endl;
//				cout<<"计算4和7的数量\n"; 
				int a4=0,a7=0;
				for(int i = 0 ;i < n;i++){
					if(ans[i]=='4')a4++;
					else a7++;
				}
//				cout<<"贪心取最优解\n"; 
				if(a4-a7<0){
					n+=2;
					for(int i =1;i <= n/2;i++)cout<<4;
					for(int i =1;i <= n/2;i++)cout<<7;
					cout<<endl;continue;
				}
				int ax=(a4-a7)/2;
				for(int i = n-1;i >= 0 && ax;i--){
					if(ans[i]=='4')ans[i]='7',ax--;
				}
//				cout<<"输出:"; 
				cout<<ans<<endl;
			}
		}
	}
	return 0;
}

2023/10/5 07:47
加载中...