校内测 10.27 T2 数字【模拟】


题目:

传送门


题意:

给出一个数 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.>72.=73.4<x<74.=45.<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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值