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

幸运数查找算法

题意:

找一个大于等于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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值