完美十进制数——去年天梯校赛

7-4 完美十进制数

对于一个十进制正整数 x,其包含 k 个位,每个数位的数字累加和为 sum 。如果 sum%k=0,那么这个十

进制数就是完美的。

例:对于数 12340,包含 5 位,数位累加和为 10,10%5=0,所以 12340 是完美十进制数。

给定一个十进制正整数 N,可以任意删除 N 的一些十进制位,求得到最大的完美十进制数是多少。

删除后剩余的数可以包含前导零,并且每个前导零都算作一位,例如:1063,删除最高位 1 后变成

063,包含 3 位,累加和为 9,是完美十进制数。如果删除 10 后变成 63,包含 2 位,累加和为 9,此时

就不是完美十进制数。

需要注意的是,前导零虽然占位,但不会改变十进制数值的大小,例如 063=63≤73。

如果最终答案的完美十进制数包含了前导零,前导零不用输出。

输入格式:

输入包含一行,表示十进制整数 N (1≤N≤1020),保证 N 不含前导零。

输出格式:

输出包含一行,表示得到的最大完美十进制数。不需要输出前导零。

3

输入样例1:6096

输出样例1:696

输入样例2:1063

输出样例2:63

样例解释:

063 是完美十进制数,前导零无需输出。

想法:

直接用dfs搜,用vis数组的0和1表示这一位的数字是否删除。然后存到数组v中,求最大值

复制代码
#include<bits/stdc++.h>
using namespace std;
string a;
int len;
int vis[10]={0};
vector<int> v;
void dfs(int x){//位数
	if(x==len){
		int sign=0,num=0,sum=0;
		for(int i=0;i<len;i++)	{
			if(vis[i]) {
				sum+=a[i]-'0';
				num++;
				sign=1;
			}
		}
		if(sign==0) return ;//数字全都不选
		if(sum%num==0){
			int n=0;
			for(int i=0;i<len;i++) {
				if(vis[i])
					n=n*10+a[i]-'0';
			}
			v.push_back(n);
		}
		return ;
	}
	for(int i=1;i>=0;i--){//0是不选,1是选 
		vis[x]=i;// 
		dfs(x+1);
	}
}
int main(){
	cin>>a;
	len=a.size();
	dfs(0);
	int ans=-1;
	for(int i=0;i<v.size();i++){
		ans=max(ans,v[i]);
	}
	cout<<ans;
	return 0;
}

结果没想到时间复杂度,数据范围是1<=n<=10e20,long long都爆了,这样的话就不能这么去最大值了(我还以为是1020hhh)。题解那说的是"字符串模拟十进制数比较大小",本来我就弄个sort必字符串的,结果我发现这样的话就是"9">"696"了。所以要先看一下字符串长度。

复制代码
#include<bits/stdc++.h>
using namespace std;
string a;
int len;
int vis[10]={0};
vector<string> v;//不用开个vector的v[],人家本来都是数组
bool cmp(string a,string b){
	if(a.size()==b.size()) return a>b;
	return a.size()>b.size();
}
void dfs(int x){
	if(x==len){
		int sign=0,num=0,sum=0;
		for(int i=0;i<len;i++)	{
			if(vis[i]) {
				sum+=a[i]-'0';
				num++;
				sign=1;
			}
		}
		if(sign==0) return ;
		if(sum%num==0){
			string n;
			for(int i=0;i<len;i++) {
				if(vis[i])
				{
					n+=a[i];
				}
			}
			v.push_back(n);
		}
		return ;
	}
	for(int i=1;i>=0;i--){//0是不选,1是选 
		vis[x]=i;// 
		dfs(x+1);
	}
}
int main(){
	cin>>a;
	len=a.size();
	dfs(0);
	sort(v.begin(),v.end(),cmp);
	int flag=0;
	for(int i=0;i<v[0].size();i++){
		if(v[0][i]!='0'&&flag==0){
			cout<<v[0][i];
			flag==1;
		}
		else if(flag) cout<<v[0][i];
	}
	return 0;
}
相关推荐
SweetCode9 分钟前
裴蜀定理:整数解的奥秘
数据结构·python·线性代数·算法·机器学习
ゞ 正在缓冲99%…22 分钟前
leetcode76.最小覆盖子串
java·算法·leetcode·字符串·双指针·滑动窗口
xuanjiong23 分钟前
纯个人整理,蓝桥杯使用的算法模板day2(0-1背包问题),手打个人理解注释,超全面,且均已验证成功(附带详细手写“模拟流程图”,全网首个
算法·蓝桥杯·动态规划
惊鸿.Jh42 分钟前
【滑动窗口】3254. 长度为 K 的子数组的能量值 I
数据结构·算法·leetcode
明灯L43 分钟前
《函数基础与内存机制深度剖析:从 return 语句到各类经典编程题详解》
经验分享·python·算法·链表·经典例题
碳基学AI1 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
补三补四1 小时前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
正脉科工 CAE仿真1 小时前
基于ANSYS 概率设计和APDL编程的结构可靠性设计分析
人工智能·python·算法
Dovis(誓平步青云)2 小时前
【数据结构】排序算法(中篇)·处理大数据的精妙
c语言·数据结构·算法·排序算法·学习方法