ACM-模拟/搜索 codeforces Lucky Numbers 95B

题意:

找一个大于等于k的幸运数(由4,7组成,且4,7的个数相同)

找了很久很久很久很久的bug,发现是最后填充判断的锅
我再也不用while(x>0)了=========================请用while(x-1>0)
代码

#include
#include
#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<return 0;
}

上面是我的模拟的写法
运行结果如下
ACM-模拟/搜索 codeforces Lucky Numbers 95B_第1张图片

dfs的解法
下面是大佬dfs的写法
代码

#include
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'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;
}

你可能感兴趣的:(算法题解)