Codeforces Beta Round #77 (Div. 2 Only)B. Lucky Numbers (easy)

版权声明:版权归Ordinarv所有 https://blog.csdn.net/ordinarv/article/details/85268910

题意

寻找一个最小的 大于n的super lucky数字,super lucky数字时只含4和7。

 思路

最初想着拼凑,找规律,没办法只有DFS了,

INF设的太小wa,ans会超int

ans的临时变量tem忘开long long又wa

AC Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e13+5;
ll minl(int n) {
	int len = n/2,len2 = n/2;
	ll ans = 0;
	while(len--) {
		ans*=10;
		ans+=4;
	}
	while(len2--) {
		ans*=10;
		ans+=7;
	}
	return ans;
}
ll maxl(int n) {
	int len = n/2, len2 = n/2;
	ll ans = 0;
	while(len--) {
		ans*=10;
		ans+=7;
	}
	while(len2--) {
		ans*=10;
		ans+=4;
	}
	return ans;
}
ll cnt,ans,n;
bool check(ll n) {
	int d[15],cnt = 0;
	while(n) {
		d[cnt++] = n%10;
		n/=10;
		if(d[cnt-1] != 4 && d[cnt-1] != 7) return 0;
	}
	int x=0,y=0;
	for(int i = 0; i<cnt; i++) {
		if(d[i] == 4) x++;
		else if(d[i] == 7) y++;
	}
	if(x == y) {
		return 1;
	}
	return 0;
}
void dfs(int step,ll sum) {
	if(step == cnt && sum >= n && check(sum)) {
		ans = min(sum,ans);
	}
	if(step == cnt) return ;
	sum *=10;
	step++;
	ll tem=sum+4,tem1=sum+7;
	dfs(step,tem);
	dfs(step,tem1);
}
int main() {
	ans = INF;
	cin>>n;
	cnt = 0;
	int d[15],dd = 1;
	int tem = n;
	while(tem) {
		cnt++;
		d[dd++] = tem%10;
		tem/=10;
	}

	if(cnt%2 || n>maxl(cnt)) cout<<minl(cnt+2)<<endl;
	else {
		//if(cnt>=10) cout<<"4444477777"<<endl;
		//else {
			dfs(0,0);
			cout<<ans<<endl;
	//	}
	}
	return 0;
}

正宗递归

#include<iostream>
using namespace std;
long long n, ans = 1LL << 60;
void F(long long x, int y, int z) {//通过x构造答案,y是4的个数,z是7点个数 
	if(x >= n && y == z) ans=min(ans, x);//答案ans满足要求:1.大于等于n  2.只存在7和4,且7的个数等于4的个数
	if(x > n * 100) return;//答案肯定在n和n*100之间,所以x>n*100的时候退出; 
	F(x * 10 + 4, y + 1, z);//当前答案x加一位数4 
	F(x * 10 + 7, y, z + 1);//当前答案x加一位数7
}
int main() {
	cin >> n;
	F(0, 0, 0);
	cout << ans;
	return 0;}

猜你喜欢

转载自blog.csdn.net/ordinarv/article/details/85268910