求k^k<=n的k的个数。
#include<iostream>
using namespace std;
typedef long long ll;
ll n;
int main(){
while (cin>>n) {
int ans=0;
//k最多取到15位
for(int i=1;i<=15;i++){
ll sum=1;
for(int j=1;j<=i;j++){
sum*=i;
}
if(sum<=n){ ans++;}
else break;
}
cout<<ans<<endl;
}
return 0;
}
第二次更新,搞定了,直接字符串比较大小,比较难处理的就是如a,aaabb这种形式的。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int l,n;
string g[10];
//主要处理前缀相同的情况,如a,aaab这种情况
inline bool cmp(string &s1,string &s2){
if(s1.size()>s2.size()){
string s,ss;
ss=s2;
int p=0;
while(s1.substr(p,s2.size())==s2) p+=s2.size();
s=s1.substr(p,s1.size());
return (s+ss)>(ss+s);
}
else if(s1.size()<s2.size()){
string s,ss;
ss=s2;
int p=0;
while(s2.substr(p,s1.size())==s1)
p+=s1.size();
ss=s2.substr(p,s2.size());
return (s+ss)>(ss+s);
}
return s1>s2;
}
int main(){
cin>>l;
for(int i=0;i<l;i++){
cin>>n;
for(int i=0;i<n;i++)
cin>>g[i];
sort(g,g+n,cmp);
for(int i=0;i<n;i++){
cout<<g[i];
}
cout<<endl;
}
return 0;
}
下面是第一次WA的代码。。。。
考虑的不对,找出最大的数,求出他的位数,其余小于这个数的数末尾补0使得位数相等,然后比较,记录下标。
这个想法是错误的,比如a,aaaaab这种就不可以。
9和911119应该组合为9911119才是最大,而不是9111199最大。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 10
using namespace std;
int T,n,ans,p,q,x,y,z;
typedef struct Node{
int value,index;
}node;
node a[maxn],b[maxn];
int max(int a,int b){return a>b?a:b;}
bool cmp(node a,node b){return a.value>b.value;}
int len(int q){
ans=0;
while(q){
q/=10;
ans++;
}
return ans;
}
void init(){
cin>>n;
for(int i=0;i<maxn;i++){
a[i].index=0;
a[i].value=0;
}
for(int i=0;i<n;i++){
cin>>x;
a[i].value=x;
a[i].index=i;
b[i].value=x;
b[i].index=i;
}
int tmp=0;
for(int i=0;i<n;i++){
tmp=max(tmp,a[i].value);
}
tmp=len(tmp); //最长的位数
for(int i=0;i<n;i++){
int len1=len(a[i].value);
if(len1<tmp){
for(int j=0;j<tmp-len1;j++)
a[i].value*=10;
}
}
}
void solve(){
sort(a,a+n,cmp);
for(int i=0;i<n;i++){
cout<<b[a[i].index].value;
}
cout<<endl;
}
int main(){
cin>>T;
while(T--){
init();
solve();
}
return 0;
}