NJUPT 2018 SpringTraining 9

这里写图片描述
这里写图片描述
求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;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/80010404