
本人试图用贪心解决这一道题,但是贪心已经贪到了极端的情况下了,举不出反例,站外评测结果是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;
}