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;
- }