题意:
找一个大于等于k的幸运数(由4,7组成,且4,7的个数相同)
找了很久很久很久很久的bug,发现是最后填充判断的锅
我再也不用while(x>0)了=========================请用while(x-1>0)
代码
#include<bits/stdc++.h>
#include<cstring>
#include<string>
#define inf 0x3f3f3f3f
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
int len;//sub(4-7)
string a,b,c;
int main(){
ios::sync_with_stdio(false);
while(cin>>a){
b.clear();
c.clear();
len=a.size();
int i;
if(len&1){//odd
len++;
for(i=0;i<len/2;i++)b+='4';
for(i=len/2;i<len;i++)b+='7';
}
else {//even
for(i=0;i<len/2;i++)c+='7';
for(i=len/2;i<len;i++)c+='4';
if(a==c)b=c;
else if(a>c){//len+2
len=len+2;
for(i=0;i<len/2;i++)b+='4';
for(i=len/2;i<len;i++)b+='7';
}
else {//len
int x4=len/2,y7=len/2;
bool jie=false; //借位判断
for(i=0;!jie&&i<len;i++){
if(a[i]<='4'&&x4-1>=0){
b+='4';x4--;
if(a[i]<'4'){
jie=true;
break;
}
}
else if(a[i]<='7'&&y7-1>=0){
b+='7';y7--;
if(a[i]<'7'){
jie=true;
break;
}
}
else {
while(*(b.end()-1)=='7'){b.erase(b.end()-1);y7++;}
if(*(b.end()-1)=='4'){b.erase(b.end()-1);x4++;}
if(y7-1>=0){b+='7';y7--;jie=true;break;}//bu 7
}
}
if(jie){
while(x4-1>=0){b+='4';x4--;}
while(y7-1>=0){b+='7';y7--;}
}
}
}
cout<<b<<endl;
a.clear();
}
return 0;
}
上面是我的模拟的写法
运行结果如下
dfs的解法
下面是大佬dfs的写法
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=110005;
char ans[MAXN],s[MAXN];
int len;
bool judge(int pos,int flag,int sev,int four)
{
if(pos>=len) return 1;//done
if(flag)//jie
{
int i;
for(i=0;i<four;i++) ans[i+pos]='4';
int t=i+pos;
for(t;t<len;t++) ans[t]='7';
return 1;
}
if(four&&s[pos]<='4')
{
if(judge(pos+1,s[pos]<'4',sev,four-1))//jie
{
ans[pos]='4';
return 1;
}
}
if(sev&&s[pos]<='7')
{
if(judge(pos+1,s[pos]<'7',sev-1,four))//jie
{
ans[pos]='7';
return 1;
}
}
return 0;
}
int main()
{
scanf("%s",s);
len=strlen(s);
if(len&1||!judge(0,0,len/2,len/2))
{
len+=1+(len%2==0);
for(int i=0;i<len/2;i++)
ans[i]='4';
for(int i=len/2;i<len;i++)
ans[i]='7';
}
ans[len]=0;
printf("%s\n",ans);
return 0;
}