题目:
题意:
给出一个数 n n n,我们要找到第一个不小于 n n n且只由相同个数的 4 4 4和 7 7 7组成的数
分析:
大模拟了
但我们的思路要足够清晰,考场上就东一个情况,西一个情况,脑子乱如麻,但后来看了聪爷的标,又成诸葛亮了
对于一个位置上的数,分成五种情况:
1.
>
7
、
2.
=
7
、
3.4
<
x
<
7
、
4.
=
4
、
5.
<
4
1.>7、2.=7、3.4<x<7、4.=4、5.<4
1.>7、2.=7、3.4<x<7、4.=4、5.<4
情况一,我们显然无法满足,可以跑了
情况二与情况三,我们都只能填入
7
7
7,不同的是,情况三填入
7
7
7后我们就可以确定后面的所有位置了
情况四与情况五,优先考虑能否填
4
4
4,不行再考虑
7
7
7,情况五和情况三是一样的
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cmath>
#define LL long long
#define mo 1000000007
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1; s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0'; s=getchar();}
return d*f;
}
char s[100005],ans[100005];int len;
int dfs(int k,int c4,int c7)
{
if(k==len) return 1;
if(s[k]>'7') return 0;
if(s[k]=='7')
{
if(!c7) return 0;
ans[k]='7';
return dfs(k+1,c4,c7-1);
}
if(s[k]>'4')
{
if(!c7) return 0;
int l=k+1; ans[k]='7';
for(int i=1;i<=c4;i++) ans[l++]='4';
for(int i=1;i<c7;i++) ans[l++]='7';
return 1;
}
if(s[k]=='4')
{
if(c4)
{
ans[k]='4';
if(dfs(k+1,c4-1,c7)) return 1;
}
if(c7)
{
ans[k]='7';
int l=k+1;
for(int i=1;i<=c4;i++) ans[l++]='4';
for(int i=1;i<c7;i++) ans[l++]='7';
return 1;
}
return 0;
}
else
{
int l=k+1;
if(c4) ans[k]='4',c4--; else ans[k]='7',c7--;
for(int i=1;i<=c4;i++) ans[l++]='4';
for(int i=1;i<=c7;i++) ans[l++]='7';
return 1;
}
return 0;
}
int main()
{
// freopen("6.in","r",stdin);
// freopen("6.ans","w",stdout);
while(scanf("%s",s)!=EOF)
{
len=strlen(s);
if(!(len&1)&&dfs(0,len/2,len/2))
{
for(int i=0;i<len;i++) printf("%c",ans[i]);
printf("\n");
}
else
{
for(int i=1;i<=len/2+1;i++) printf("4");
for(int j=1;j<=len/2+1;j++) printf("7");
printf("\n");
}
}
return 0;
}