题解:P12186 [蓝桥杯 2025 省 Python A/研究生组] 最大数字
__shenliyan_Fly__ · · 题解
先看看题目要我们干什么。读完题后,可知题目要求给定整数
核心思路:贪心。
难点:大数处理
对于两个数
当
代码实现 (呜呜呜这马蜂没救了。。。。。。)
#include<bits/stdc++.h>
using namespace std;
bool c(const string&x,const string&y){return x+y<y+x;}
string t(int n,int k){
if(n==0)return"0";
string a;
while(n>0){int r=n%k;a+=r<10?r+'0':r-10+'A';n/=k;}
reverse(a.begin(),a.end());
return a;
}
string b2d(const string&bin){
vector<int>d={0};
for(char ch:bin){
int c=0;
for(int i=0;i<d.size();++i){int v=d[i]*2+c;d[i]=v%10;c=v/10;}
while(c){d.push_back(c%10);c/=10;}
if(ch=='1'){
int ca=1;
for(int i=0;i<d.size()&&ca;++i){int v=d[i]+ca;d[i]=v%10;ca=v/10;}
if(ca)d.push_back(ca);
}
}
string r;
for(int i=d.size()-1;i>=0;--i)r+=d[i]+'0';
return r;
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(0);
int n;cin>>n;
vector<string>s(n+1);
for(int i=1;i<=n;++i)s[i]=t(i,2);
sort(s.begin()+1,s.end(),c);
string m;
for(int i=n;i>=1;--i)m+=s[i];
cout<<b2d(m)<<endl;
return 0;
}
总结
- 贪心策略是排序的核心,通过比较拼接结果确定顺序。
- 大数处理是关键,避免直接使用整数导致溢出,需用字符串模拟运算。
- 逆序拼接是排序后得到最大结果的必要步骤。