ACdream地区試合指導試合の手速試合シリーズ(5)解題報告A C D

5041 ワード

Problem A
題意:進数変換であり、異なる進数の異なる記号システム間で変換され、デジタル記号は必ずしも通常使用される0123ではなく、1つの文字列によって与えられる.
構想:水題、記号システムの長さは何進数で、回転してから相応の記号で出力すればいいです.
/*
* this code is made by squee_spoon
* Problem: 1038
* Verdict: Accepted
* Submission Date: 2014-08-22 19:41:23
* Time: 0MS
* Memory: 1676KB
*/
#include <iostream>   
#include <stdio.h>   
#include <cmath>   
#include <algorithm>   
#include <iomanip>   
#include <cstdlib>   
#include <string>   
#include <memory.h>   
#include <vector>   
#include <queue>   
#include <stack>   
#include <map> 
#include <set> 
#include <ctype.h>   
#include <sstream>
#define INF 1000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 100010
 
using namespace std; 
 
int main() {
    int t;
    cin>>t;
    int _case=0;
    while(t--){
        _case++;
         
        string num;
        string s;
        string t;
        cin>>num>>s>>t;
        int lens=s.size();
        int lent=t.size();
        int lennum=num.size();
        //  10  
        ll s10=0;
         
        for(int i=0;i<lennum;i++){
            s10*=lens;
            int end=s.size();
            int j;
            for(j=0;j<end;j++){
                if(num[i]==s[j])break;
            }
            s10+=(j);
        }
         
        ll tmp=1;
        int k=0;
        while(tmp<=s10){
            tmp*=lent;
            k++;
        }
         
         
        tmp/=lent;
        printf("Case #%d: ",_case);
        if(s10==0)cout<<t[0];
        for(int i=k;i>0;i--){
            int cnt=0;
            while(s10-tmp>=0){
                s10-=tmp;
                cnt++;
            }
            tmp/=lent;
            cout<<t[cnt];
        }
         
        cout<<endl;
    }
    return 0;
}

Problem C
件名:文字列を挿入ソートします.何回移動するかを尋ねる.
構想:水題.現在の最後の文字列を記録します.次がそれより小さい場合は、回数+1です.
/*
* this code is made by squee_spoon
* Problem: 1146
* Verdict: Accepted
* Submission Date: 2014-08-22 20:02:19
* Time: 12MS
* Memory: 1676KB
*/
#include <iostream>   
#include <stdio.h>   
#include <cmath>   
#include <algorithm>   
#include <iomanip>   
#include <cstdlib>   
#include <string>   
#include <memory.h>   
#include <vector>   
#include <queue>   
#include <stack>   
#include <map> 
#include <set> 
#include <ctype.h>   
#include <sstream>
#define INF 1000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 100010
 
using namespace std; 
 
int main() {
    int t;
    cin>>t;
    int _case=0;
    while(t--){
        _case++;
        int n;
        cin>>n;
        string str;
        string last;
        getline(cin,last);
        getline(cin,last);
        int ans=0;
        for(int i=2;i<=n;i++){
            getline(cin,str);
            if(last>str){
                ans++;
            }else{
                last=str;
            }
        }
        printf("Case #%d: ",_case);
        cout<<ans<<endl;
    }
    return 0;
}

Problem D
題意:一連の数字を並べ替える.並んだ後は元々奇数の位置なのか奇数なのか、偶数の位置なのか偶数なのか.ここで奇数は昇順、偶数は降順である.
構想:水題.
/*
* this code is made by squee_spoon
* Problem: 1189
* Verdict: Accepted
* Submission Date: 2014-08-22 20:15:09
* Time: 8MS
* Memory: 1684KB
*/
#include <iostream>   
#include <stdio.h>   
#include <cmath>   
#include <algorithm>   
#include <iomanip>   
#include <cstdlib>   
#include <string>   
#include <memory.h>   
#include <vector>   
#include <queue>   
#include <stack>   
#include <map> 
#include <set> 
#include <ctype.h>   
#include <sstream>
#define INF 1000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 100010
 
using namespace std; 
 
int books[1010];
 
int main() {
    int t;
    cin>>t;
    int _case=0;
    while(t--){
        _case++;
         
        vector<int> A;
        vector<int> B;
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>books[i];
            if(books[i]&1){
                A.push_back(books[i]);
            }else{
                B.push_back(books[i]);
            }
        }
        sort(A.begin(),A.end());
        sort(B.begin(),B.end());
         
        printf("Case #%d: ",_case);
        int ka=0,kb=B.size()-1;
        for(int i=1;i<=n;i++){
            if(books[i]&1){
                cout<<A[ka++];
            }else{
                cout<<B[kb--];
            }
            if(i!=n)cout<<" ";
        }
         
        cout<<endl;
    }
    return 0;
}