C++ 彰雲嘉區複賽106-5 回文日期問題

窮舉法

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;

int dom[15]={0,31,28,31,30,31,30,31,31,30,31,30,31,0,0};
int pro[700],nt,ct=0;

void check(int y){
    if(y%400==0 || (y%4==0 && y%100!=0)){
        dom[2]=29;
    }else dom[2]=28;
}

void isv(int a){
    string s;
    int b=a;
    while(a>0){
        s+=char(a%10+'0');
        a/=10;
    }
    for(int i=0;i<=s.size()/2;i++){
        if(s[i]!=s[s.size()-1-i]){
            return;
        }
    }
    pro[nt++]=b;
    return;
}

int main(){
    ios::sync_with_stdio(0);cin.tie(0);

    int n;
    cin>>n;
    while(n--){
        int y;
        nt=ct=0;
        cin>>y;
        check(y);
        for(int i=1;i<=12;i++){
            int tmp=i;
            for(int j=1;j<=dom[i];j++){
                if(i<10){
                    if(j<10){
                        isv(y*100+i*10+j);
                        isv(y*1000+i*10+j);
                        isv(y*1000+i*100+j);
                        isv(y*10000+i*100+j);
                    }else{
                        isv(y*1000+i*100+j);
                        isv(y*10000+i*100+j);
                    }
                }else{
                    if(j<10){
                        isv(y*1000+i*10+j);
                        isv(y*10000+i*100+j);
                    }else{
                        isv(y*10000+i*100+j);
                    }
                }
            }
            i=tmp;
        }
        cout<<nt<<" ";
        sort(pro,pro+nt);
        for(int i=0;i<nt;i++){
            cout<<pro[i]<<" ";
        }
        cout<<"\n";
    }
    return 0;
} 

出處:GreenJudge

C++ 彰雲嘉區複賽106-4 變位字判斷

用map很方便(如果是C++11更方便)

#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<string>
#include<cstdlib>
using namespace std;

int main(){
    ios::sync_with_stdio(0);cin.tie(0);

    string a,b;
    int n;
    cin>>n;
    getline(cin,a);
    while(n--){
        getline(cin,a);
        getline(cin,b);
        map<char,int> ma,mb;

        for(int i=0;i<a.size();i++){
            char c=a[i];
            if(islower(c)){
                ma[c]++;
            }else if(isupper(c)){
                ma[tolower(c)]++;
            }
        }

        for(int i=0;i<b.size();i++){
            char c=b[i];
            if(islower(c)){
                mb[c]++;
            }else if(isupper(c)){
                mb[tolower(c)]++;
            }
        }

        bool isv=true;
        map<char,int>::iterator ta=ma.begin(),tb=mb.begin();
        for(ta=ma.begin();ta!=ma.end() && tb!=mb.end();ta++){
            pair<char,int> pa=(*ta),pb=(*tb);
            if(pa!=pb){
                isv=false;
            }
            tb++;
        }
        if(ma.size()!=mb.size()) isv=false;
        cout<<isv<<"\n";
    }
    return 0;
}

出處:GreenJudge

C++ 彰雲嘉區複賽106-3 費波南希數列

用到最簡單DP和二分搜(都可以不用)

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
    ios::sync_with_stdio(0);cin.tie(0);

    int n,f[200];
    cin>>n;

    f[0]=-1;f[1]=1;f[2]=1;
    for(int i=3;i<100;i++){
        f[i]=f[i-1]+f[i-2];
        if(f[i]<0) f[i]=0x3f3f3f3f;
    }

    while(n--){
        int a;
        cin>>a;
        int it=lower_bound(f,f+100,a)-f;
        if(f[it]==a){
            cout<<it;
        }else{
            cout<<-1;
        }
        cout<<"\n";
    }
    return 0;
}

出處:GreenJudge