1. 程式人生 > >PAT (Basic Level) Practise(中文)----30題解題報告

PAT (Basic Level) Practise(中文)----30題解題報告

注:這裡涵蓋了PAT BASIC的全部30道題,難度較易,但還是為初學者做一個參考,最好自己想出思路,找出錯誤資料,程式碼僅供參考。

1001 注意統計砍一半的次數

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

int n;
void solve() {
    int cnt = 0;
    while(n != 1) {
        if(n & 1) n = (3*n+1)>>1;
        else n >>= 1;
        cnt++;
    }
    printf("%d\n", cnt);
}
int main() {
    while(~scanf("%d", &n)) {
        solve();
    }
}
1002  不解釋
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;

char s[1010];
string dig[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
void solve() {
    int i = 0, sum = 0;
    while(s[i] != '\0') {
        sum += s[i]-'0';
        i++;
    }
    stack<int> stk;
    while(sum) {
        stk.push(sum%10);
        sum /= 10;
    }
    while(stk.size() > 1) {
        cout << dig[stk.top()] << " ";
        stk.pop();
    }
    cout << dig[stk.top()] << endl;
    stk.pop();
}
int main() {
    while(~scanf("%s", s))
        solve();
    return 0;
}
1003 我要通過

有幾點注意:

1:不能有除P、A、T外其他字元,且P和T只能出現一次,且P在T左邊

2:說白了就是判斷(P左邊A的個數)*(P與T之間A的個數)是否等於(T右邊A的個數)。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main() {
    int t;
    char s[110];
    scanf("%d", &t);
    while(t--) {
        scanf("%s", s);
        bool flag = true;
        int n = strlen(s);
        int pp = -1, pt = -1;
        for(int i = 0; i < n; i++) {
            if(s[i] != 'P' && s[i] != 'A' && s[i] != 'T') { flag = false; break;}
            if(s[i] == 'P') {
                if(pp == -1) pp = i;
                else {flag = false; break; }
            }
            if(s[i] == 'T') {
                if(pt == -1) pt = i;
                else {flag = false; break; }
            }
        }
        if(!flag || pt - pp < 2) { printf("NO\n"); continue; }
        if((pp*(pt-pp-1) == n-pt-1)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
1004 不解釋
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main() {
    int n, grade[1010];
    string name[1010], id[1010];
    while(cin >> n) {
        int maxg = 0, ming = 101, id1 = 0, id2 = 0;
        for(int i = 0; i < n; i++) {
            cin >> name[i] >> id[i] >> grade[i];
            if(maxg < grade[i]) { id1 = i; maxg = grade[i]; }
            if(ming > grade[i]) { id2 = i; ming = grade[i]; }
        }
        cout << name[id1] << " " << id[id1] << endl;
        cout << name[id2] << " " << id[id2] << endl;
    }
    return 0;
}
1005 繼續3n+1猜想

數字有3中狀態:0未使用,1使用但為被覆蓋,2使用且被覆蓋。那麼重要的就是標記過程了,具體見程式碼。

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

int n, a[110], vis[110], key[110];
bool cmp(int a, int b) {
    return a > b;
}
void solve() {
    for(int i = 0; i < n; i++) {
        long long m = a[i];
        if(vis[m] == 2) continue;
        while(m != 1) {
            if(m & 1) m = (m*3+1)>>1;
            else m >>= 1;
            if(m > 100) continue;
            if(vis[m] == 2) break;
            if(vis[m] == 1) vis[m] = 2;
        }
    }
    int cnt = 0;
    for(int i = 0; i <= 100; i++)
        if(vis[i] == 1) key[cnt++] = i;
    sort(key, key+cnt, cmp);
    for(int i = 0; i < cnt-1; i++)
        printf("%d ", key[i]);
    printf("%d\n", key[cnt-1]);
}
int main() {
    while(~scanf("%d", &n)) {
        memset(vis, 0, sizeof(vis));
        for(int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
            vis[a[i]] = 1;
        }
        solve();
    }
    return 0;
}
1006 不解釋
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int dig[3], n;
    while(~scanf("%d", &n)) {
        dig[0] = dig[1] = dig[2] = 0;
        int i = 0;
        while(n != 0) {
            dig[i++] = n%10;
            n /= 10;
        }
        if(dig[2] != 0) for(int i = 0; i < dig[2]; i++) printf("B");
        if(dig[1] != 0) for(int i = 0; i < dig[1]; i++) printf("S");
        if(dig[0] != 0) for(int i = 1; i <= dig[0]; i++) printf("%d", i);
        printf("\n");
    }
}
1007 用篩法把100000以內素數都求出來
#include <iostream>
#include <cstdio>
using namespace std;

const int MAX_N = 100010;
int prime[MAX_N];
bool is_prime[MAX_N+1];
int cnt = 0, n;
void GetPrime() {
    for(int i = 0; i <= MAX_N; i++) is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for(int i = 2; i <= MAX_N; i++)
        if(is_prime[i]) {
            prime[cnt++] = i;
            for(int j = 2*i; j <= MAX_N; j += i)
                is_prime[j] = false;
        }
}

void solve() {
    int res = 0;
    for(int i = 1; i < cnt && prime[i] <= n; i++)
        if(prime[i]-prime[i-1] == 2) res++;
    printf("%d\n", res);
}
int main() {
    GetPrime();
    while(~scanf("%d", &n))
        solve();
    return 0;
}
1008 不解釋
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int n, m, a[110];
    while(~scanf("%d%d", &n, &m)) {
        m %= n;
        for(int i = 0; i < n; i++) scanf("%d", &a[i]);
        for(int i = n-m; i < n; i++) printf("%d ", a[i]);
        for(int i = 0; i < n-1-m; i++) printf("%d ", a[i]);
        printf("%d\n", a[n-1-m]);
    }
    return 0;
}
1009 不解釋
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main() {
    string str[100];
    int n = 0;
    while(cin >> str[n++]) ;
    for(int i = n-2; i > 0; i--)
        cout << str[i] << " ";
    cout << str[0] << endl;
    return 0;
}
1010 注意最後求得導數為0 的情況
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    //freopen("in.txt", "r", stdin);
    bool flag = true;
    int a[1010], b[1010];
    int n = 0;
    while(~scanf("%d", &a[n++])) ;
    int cnt = 0;
    for(int i = 0; i < n; i += 2)
        if(a[i] != 0 && a[i+1] != 0 ) {
            b[cnt++] = a[i]*a[i+1];
            b[cnt++] = a[i+1]-1;
        }
    if(cnt == 0) printf("0 0\n");
    else {
        for(int i = 0; i < cnt-1; i++) printf("%d ", b[i]);
        printf("%d\n", b[cnt-1]);
    }
    return 0;
}
1011 long long就可以過
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int t;
    long long a, b, c;
    scanf("%d", &t);
    for(int cas = 1; cas <= t; cas++) {
        scanf("%lld%lld%lld", &a, &b, &c);
        printf("Case #%d: ", cas);
        if(a+b > c) printf("true\n");
        else printf("false\n");
    }
    return 0;
}
1012 注意每種數字個數為0的表示情況
#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;

int main() {
    //freopen("in.txt", "r", stdin);
    int A1, A2, A3, A5, c2, c4, c5, x, N;
    float A4;
    while(~scanf("%d", &N)) {
        int flag = 1;
        A1 = A2 = A3 = A5 = c2 = c4 = c5 = 0;
        A4 = 0;
        while(N--) {
            scanf("%d", &x);
            if(x % 5 == 0) { if(x % 2 == 0) A1 += x; }
            else if(x % 5 == 1) { A2 += flag*x; flag = -flag; c2++; }
            else if(x % 5 == 2) A3++;
            else if(x % 5 == 3) {A4 += x; c4++; }
            else if(x % 5 == 4) { if(A5 < x) A5 = x; c5++; }
        }
        if(A1 == 0) printf("N ");
        else printf("%d ", A1);
        if(c2 == 0) printf("N ");
        else printf("%d ", A2);
        if(A3 == 0) printf("N ");
        else printf("%d ", A3);
        if(c4 == 0) printf("N ");
        else printf("%.1f ", A4/c4);
        if(c5 == 0) printf("N\n");
        else printf("%d\n", A5);
    }
    return 0;
}
1013 範圍太大,依然用篩法,時間上有保證,但注意邊界
#include <iostream>
#include <cstdio>
using namespace std;

int prime[10010], n = 1;
bool is_prime[105000];
void GetPrime() {
    for(int i = 0; i <= 105000; i++) is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for(int i = 2; i <= 105000; i++)
        if(is_prime[i]) {
            prime[n++] = i;
            for(int j = 2*i; j <= 105000; j += i)
                is_prime[j] = false;
        }
}
int main() {
    int N, M;
    GetPrime();
    while(~scanf("%d%d", &N, &M)) {
        int cnt = 0;
        for(int i = prime[N]; i <= prime[M]; i++) {
            if(is_prime[i]) {
                if(cnt == 0) { printf("%d", i); cnt++; }
                else if(cnt < 9) { printf(" %d", i); cnt++; }
                else { printf(" %d\n", i); cnt = 0; }
            }
        }
        if((M-N+1)%10 != 0) printf("\n");
    }
    return 0;
}
1014 注意順序,還能不能好好的約會了!!!
#include <iostream>
#include <cstdio>
#include <ctype.h>
using namespace std;

char DAY[8][4] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};
int main() {
    char s1[66], s2[66], s3[66], s4[66];
    int day, hour, minute;
    while(~scanf("%s%s%s%s", s1, s2, s3, s4)) {
        int id = 0;
        for(int i = 0; s1[i] != '\0'; i++)
            if(s1[i] == s2[i] && s1[i] >= 'A' && s1[i] <= 'G') { day = s1[i]-'A'; id = i; break; }
        for(int i = id+1; s1[i] != '\0'; i++)
            if(s1[i] == s2[i]) {
                if(s1[i] >= 'A' && s1[i] <= 'N') { hour = s1[i]-'A'+10; break; }
                else if(s1[i] >= '0' && s1[i] <= '9') { hour = s1[i]-'0'; break; }
            }
        for(int i = 0; s3[i] != '\0'; i++)
            if(s3[i] == s4[i] && isalpha(s3[i])) { minute = i; break; }
        printf("%s %02d:%02d\n", DAY[day], hour, minute);
    }
    return 0;
}
1015 分開成4種人,逐個進行排序
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

struct node {
    int id, df, cf;
    bool operator < (const node& rhs) const {
        if(df+cf != rhs.df+rhs.cf) return df+cf > rhs.df+rhs.cf;
        if(df != rhs.df) return df > rhs.df;
        return id < rhs.id;
    }
};
vector<node> one, two, thr, four;
int N, L, H;
int main() {
    int id, cf, df, c1, c2, c3, c4;
    while(~scanf("%d%d%d", &N, &L, &H)) {
        one.clear(); two.clear(); thr.clear(); four.clear();
        while(N--) {
            scanf("%d%d%d", &id, &df, &cf);
            if(df < L || cf < L) continue;
            if(cf >= H && df >= H) one.push_back((node){id, df, cf});
            else if(cf < H && df >= H) two.push_back((node){id, df, cf});
            else if(cf < H && df < H && df >= cf) thr.push_back((node){id, df, cf});
            else four.push_back((node){id, df, cf});
        }
        sort(one.begin(), one.end());
        sort(two.begin(), two.end());
        sort(thr.begin(), thr.end());
        sort(four.begin(), four.end());
        c1 = one.size(); c2 = two.size(); c3 = thr.size(); c4 = four.size();
        printf("%d\n", c1+c2+c3+c4);
        for(int i = 0; i < c1; i++)
            printf("%d %d %d\n", one[i].id, one[i].df, one[i].cf);
        for(int i = 0; i < c2; i++)
            printf("%d %d %d\n", two[i].id, two[i].df, two[i].cf);
        for(int i = 0; i < c3; i++)
            printf("%d %d %d\n", thr[i].id, thr[i].df, thr[i].cf);
        for(int i = 0; i < c4; i++)
            printf("%d %d %d\n", four[i].id, four[i].df, four[i].cf);
    }
}

1016 不解釋

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

int main() {
    int a, b, da, db;
    while(~scanf("%d%d%d%d", &a, &da, &b, &db)) {
        int ca = 0, cb = 0;
        while(a != 0) {
            if(da == a%10) ca++;
            a /= 10;
        }
        while(b != 0) {
            if(db == b%10) cb++;
            b /= 10;
        }
        int pa = 0, pb = 0;
        int x = 1;
        while(ca--) {
            pa += da*x;
            x *= 10;
        }
        x = 1;
        while(cb--) {
            pb += db*x;
            x *= 10;
        }
        printf("%d\n", pa+pb);
    }
    return 0;
}
1017 手算怎麼算,你就怎麼算,注意商為0
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    char s[1010];
    int n, b, a[1010], q[1010];
    while(~scanf("%s%d", s, &b)) {
        for(n = 0; s[n] != '\0'; n++) a[n] = s[n]-'0';
        if(n == 1 && a[0] < b) { printf("0 %d\n", a[0]); continue; }
        q[1] = 0;
        for(int i = 0; i < n-1; i++) {
            q[i] = a[i]/b;
            a[i+1] += a[i]%b*10;
        }
        q[n-1] = a[n-1]/b;
        if(q[0] != 0) printf("%d", q[0]);
        for(int i = 1; i < n; i++) printf("%d", q[i]);
        printf(" %d\n", a[n-1]%b);
    }
    return 0;
}
1018 不解釋
#include <iostream>
#include <cstdio>
using namespace std;

int judge(char x, char y) {
    if(x == y) return 1;
    if((x == 'C' && y == 'J') || (x == 'J' && y == 'B') || (x == 'B' && y == 'C')) return 0;
    return 2;
}
int main() {
    //freopen("in.txt", "r", stdin);
    int N, JS, JP, J[3], Y[3];
    char JIA, YI;
    while(~scanf("%d", &N, &JIA)) {
        JS = JP = J[0] = J[1] = J[2] = Y[0] = Y[1] = Y[2] = 0;
        for(int i = 0; i < N; i++) {
            scanf("\n%c %c", &JIA, &YI);
            int ans = judge(JIA, YI);
            if(ans == 0) {
                JS++;
                if(JIA == 'C') J[1]++;
                else if(JIA == 'J') J[0]++;
                else if(JIA == 'B') J[2]++;
            }
            else if(ans == 1) { JP++; }
            else {
                if(YI == 'C') Y[1]++;
                else if(YI == 'J') Y[0]++;
                else if(YI == 'B') Y[2]++;
            }
        }
        printf("%d %d %d\n%d %d %d\n", JS, JP, N-JS-JP, N-JS-JP, JP, JS);
        int maxj = 0, maxy = 0, idj, idy;
        for(int i = 0; i < 3; i++) {
            if(maxj <= J[i]) { maxj = J[i]; idj = i; }
            if(maxy <= Y[i]) { maxy = Y[i]; idy = i; }
        }
        if(idj == 0) printf("J ");
        else if(idj == 1) printf("C ");
        else if(idj == 2) printf("B ");
        if(idy == 0) printf("J\n");
        else if(idy == 1) printf("C\n");
        else if(idy == 2) printf("B\n");
    }
    return 0;
}
1019 注意一開始輸入就是6174的情況
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

void getnum(int& x, int& a, int& b) {
    int num[5], n = 0;
    num[0] = num[1] = num[2] = num[3] = 0;
    while(x != 0) {
        num[n++] = x%10;
        x /= 10;
    }
    sort(num, num+4);
    a = num[3]*1000+num[2]*100+num[1]*10+num[0];
    b = num[0]*1000+num[1]*100+num[2]*10+num[3];
    x = a - b;
}
int main() {
    int a, b, x;
    while(~scanf("%d", &x)) {
        while(1) {
            getnum(x, a, b);
            printf("%04d - %04d = %04d\n", a, b, x);
            if(x == 0 || x == 6174) break;
        }
    }
    return 0;
}
1020 月餅單價排序
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

struct node {
    double sto, sell, price;
    bool operator < (const node& rhs) const {
        return price > rhs.price;
    }
}MK[1010];

int N, D;
int main() {
    while(~scanf("%d%d", &N, &D)) {
        for(int i = 0; i < N; i++) scanf("%lf", &MK[i].sto);
        for(int i = 0; i < N; i++) scanf("%lf", &MK[i].sell);
        for(int i = 0; i < N; i++) MK[i].price = MK[i].sell/MK[i].sto;
        sort(MK, MK+N);
        double res = 0;
        for(int i = 0; i < N; i++) {
            if(D <= MK[i].sto) { res += MK[i].price*D; break; }
            res += MK[i].sell;
            D -= MK[i].sto;
        }
        printf("%.2lf\n", res);
    }
    return 0;
}

1021 不解釋

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main() {
    char s[1010], num[11];
    while(~scanf("%s", s)) {
        memset(num, 0, sizeof(num));
        for(int i = 0; s[i] != '\0'; i++) num[s[i]-'0']++;
        for(int i = 0; i < 10; i++)
            if(num[i] != 0) printf("%d:%d\n", i, num[i]);
    }
    return 0;
}
1022 進位制轉換
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int dig[50], n, a, b, d;
    while(~scanf("%d%d%d", &a, &b, &d)) {
        int c = a+b;
        if(c == 0) { printf("0\n"); continue; }
        n = 0;
        while(c != 0) {
            dig[n++] = c%d;
            c /= d;
        }
        for(int i = n-1; i >= 0; i--)
            printf("%d", dig[i]);
        printf("\n");
    }
    return 0;
}
1023 先取個非0最小數,再把所有0跟上,然後其他所有數從小到大排。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main() {
    int num[11];
    while(~scanf("%d", &num[0])) {
        for(int i = 1; i <= 9; i++) scanf("%d", &num[i]);
        int id = 0;
        for(int i = 1; i <= 9; i++) if(num[i] != 0) { id = i; break; }
        printf("%d", id); num[id]--;
        while(num[0]--) cout << "0";
        for(int i = 1; i <= 9; i++) {
            while(num[i]--) cout << i;
        }
        cout << endl;
    }
    return 0;
}
1024 科學計數法

指數為正式,主要問題在於判斷小數點最後變到了哪裡。

指數為負時,主要問題在於前面加上幾個0。

有很多細節要注意。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

char s[10010];
int main() {
    //freopen("in.txt", "r", stdin);
    while(~scanf("%s", s)) {
        if(s[0] == '-') printf("-");
        int e = 4;
        while(s[e] != 'E') e++;
        int id = e+2, p2 = 0;
        while(s[id] != '\0') { p2 = 10*p2+s[id]-'0'; id++; }
        if(s[e+1] == '+') {
            printf("%c", s[1]);
            id = p2+2;
            if(id < e) {
                for(int i = 3; i <= id; i++) printf("%c", s[i]);
                if(id != e-1) printf(".");
                for(int i = id+1; i < e; i++) printf("%c", s[i]);
            } else {
                for(int i = 3; i < e; i++) printf("%c", s[i]);
                for(int i = e; i <= id; i++) printf("0");
            }
        } else {
            if(p2 == 0){
                printf("%c.", s[1]);
            } else {
                printf("0.");
                for(int i = 1; i < p2; i++) printf("0");
                printf("%c", s[1]);
            }
            for(int i = 3; i < e; i++) printf("%c", s[i]);
        }
        printf("\n");
    }
    return 0;
}
1025 反轉連結串列

用陣列做可以不用反轉直接輸出來,但是判斷每段首尾挺麻煩,用STL的reverse實在方便。

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

typedef pair<int, int> P;
P coll[100010];
struct node {
    int addr, data, next;
};
vector<node> LK;

int main() {
    int n, k, head, addr, data, next;
    while(~scanf("%d%d%d", &head, &n, &k)) {
        LK.clear();
        for(int i = 0; i < n; i++) {
            scanf("%d%d%d", &addr, &data, &next);
            P p;
            p.first = data; p.second = next;
            coll[addr] = p;
        }
        int cnt = 0, index = head;
        while(index != -1) {
            LK.push_back((node){index, coll[index].first, coll[index].second});
            index = coll[index].second;
            cnt++;
        }
        int t = cnt/k;
        for(int i = 0; i < t; i++)
            reverse(LK.begin()+i*k, LK.begin()+(i+1)*k);
        t = LK.size();
        for(int i = 0; i < t-1; i++)
            printf("%05d %d %05d\n", LK[i].addr, LK[i].data, LK[i+1].addr);
        printf("%05d %d -1\n", LK[t-1].addr, LK[t-1].data);
    }
    return 0;
}
1026 注意秒要四捨五入
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int C1, C2;
    while(~scanf("%d%d", &C1, &C2)) {
        int second = 1.0*(C2-C1)/100+0.5;
        int hour = second/3600;
        second %= 3600;
        int minute = second/60;
        second %= 60;
        printf("%02d:%02d:%02d\n", hour, minute, second);
    }
    return 0;
}
1027 算了,也不解釋了
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main() {
    int n;
    char c;
    while(~scanf("%d %c", &n, &c)) {
        int x = sqrt(2.0*(n+1))-1;
        if(x % 2 == 0) x--;
        for(int i = x; i >= 1; i -= 2) {
            for(int j = 0; j < (x-i)/2; j++)
                printf(" ");
            for(int j = 0; j < i; j++)
                printf("%c", c);
            printf("\n");
        }
        for(int i = 3; i <= x; i += 2) {
            for(int j = 0; j < (x-i)/2; j++)
                printf(" ");
            for(int j = 0; j < i; j++)
                printf("%c", c);
            printf("\n");
        }
        printf("%d\n", n-(x+1)*(x+1)/2+1);
    }
    return 0;
}
1028 時間比較,注意過載比較運算子,邊界問題注意
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

struct date {
    int year, month, day;
    bool operator > (const date& rhs) const {
        if(year != rhs.year) return year > rhs.year;
        if(month != rhs.month) return month > rhs.month;
        return day > rhs.day;
    }
    bool operator >= (const date& rhs) const {
        if(year != rhs.year) return year > rhs.year;
        if(month != rhs.month) return month > rhs.month;
        return day >= rhs.day;
    }
};

vector<string> name, bir;
int main() {
    int n;
    while(cin >> n) {
        date mind, maxd, tmp, dlow, dhigh;
        string nm, br;
        maxd.year = 1814; maxd.month = 9; maxd.day = 6;
        mind.year = 2014; mind.month = 9; mind.day = 6;
        dlow = maxd; dhigh = mind;
        int id1 = 0, id2 = 0, cnt = 0;
        name.clear(); bir.clear();
        for(int i = 0; i < n; i++) {
            cin >> nm >> br;
            name.push_back(nm);
            bir.push_back(br);
            tmp.year = (br[0]-'0')*1000+(br[1]-'0')*100+(br[2]-'0')*10+br[3]-'0';
            tmp.month = (br[5]-'0')*10+br[6]-'0';
            tmp.day = (br[8]-'0')*10+br[9]-'0';
            if(tmp > dhigh || dlow > tmp) continue;
            if(mind >= tmp) { mind = tmp; id1 = i; }
            if(tmp >= maxd) { maxd = tmp; id2 = i; }
            cnt++;
        }
        if(cnt > 0)
            cout << cnt << " " << name[id1] << " " << name[id2] << endl;
        else
            cout << "0" << endl;
    }
    return 0;
}
1029  字串細節
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctype.h>
using namespace std;

char s1[82], s2[82];
bool alpha[27], dig[12], space;
int main() {
    while(~scanf("%s", s1)) {
        scanf("%s", s2);
        memset(alpha, false, sizeof(alpha));
        memset(dig, false, sizeof(dig));
        space = false;
        for(int i = 0; s2[i] != '\0'; i++) {
            if(isdigit(s2[i])) {
                dig[s2[i]-'0'] = true;
            } else if(isalpha(s2[i])) {
                if(s2[i]>='a' && s2[i]<='z') s2[i] += 'A'-'a';
                alpha[s2[i]-'A'] = true;
            } else if(s2[i] == '_') space = true;
        }
        for(int i = 0; s1[i] != '\0'; i++) {
            if(isdigit(s1[i])) {
                if(!dig[s1[i]-'0']) { printf("%c", s1[i]); dig[s1[i]-'0'] = true; }
            } else if(isalpha(s1[i])) {
                if(s1[i]>='a' && s1[i]<='z') s1[i] += 'A'-'a';
                if(!alpha[s1[i]-'A'])  { printf("%c", s1[i]); alpha[s1[i]-'A'] = true; }
            } else if(s1[i] == '_') {
                if(!space) { printf("_"); space = true; }
            }
        }
        printf("\n");
    }
    return 0;
}
1030 排序,將不可以的一個個排除
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int n, p;
long long a[100010];

int main() {
    while(~scanf("%d%d", &n, &p)) {
        for(int i = 0; i < n; i++)
            scanf("%lld", &a[i]);
        sort(a, a+n);
        int ans = 0, j = 0;
        long long tmp = a[0]*p;
        for(int i = 0; i < n; i++) {
            while(j < i && tmp < a[i]) tmp = a[++j]*p;
            if(ans < i-j+1) ans = i-j+1;
        }
        printf("%d\n", ans);
    }
    return 0;
}

相關推薦

PAT (Basic Level) Practise(中文----30解題報告

注:這裡涵蓋了PAT BASIC的全部30道題,難度較易,但還是為初學者做一個參考,最好自己想出思路,找出錯誤資料,程式碼僅供參考。 1001 注意統計砍一半的次數 #include <i

PAT乙級真及訓練集 PAT (Basic Level) Practise中文1014. 福爾摩斯的約會

大偵探福爾摩斯接到一張奇怪的字條:“我們約會吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大偵探很快就明白了,字條上奇怪的亂碼實際上就是約會的時間“星期四 14:04”,因為前面兩字串中第1對相同的大寫英

PAT乙級真及訓練集 PAT (Basic Level) Practise中文1013. 數素數

令Pi表示第i個素數。現任給兩個正整數M <= N <= 104,請輸出PM到PN的所有素數。 輸入格式: 輸入在一行中給出M和N,其間以空格分隔。 輸出格式: 輸出從PM到PN的所有素數,每10個數字佔1行,其間以空格分隔,但行末不得有多餘空格。

PAT乙級真及訓練集 PAT (Basic Level) Practise中文1012. 數字分類

給定一系列正整數,請按要求對數字進行分類,並輸出以下5個數字:A1 = 能被5整除的數字中所有偶數的和;A2 = 將被5除後餘1的數字按給出順序進行交錯求和,即計算n1-n2+n3-n4...;A3 = 被5除後餘2的數字的個數;A4 = 被5除後餘3的數字的平均數,精確到小數點後1位;

PAT乙級真及訓練集 PAT (Basic Level) Practise中文1011. A+B和C

給定區間[-231, 231]內的3個整數A、B和C,請判斷A+B是否大於C。 輸入格式: 輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組佔一行,順序給出A、B和C。整數間以空格分隔。 輸出格式: 對每組測試用例,在一行中

PAT乙級真及訓練集 PAT (Basic Level) Practise中文1010. 一元多項式求導

設計函式求一元多項式的導數。(注:xn(n為整數)的一階導數為n*xn-1。) 輸入格式:以指數遞降方式輸入多項式非零項係數和指數(絕對值均為不超過1000的整數)。數字間以空格分隔。 輸出格式:以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多

PAT乙級真全集-PAT (Basic Level) Practise中文

1001. 害死人不償命的(3n+1)猜想 (15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公佈了這

PAT (Basic Level) Practise中文練習(Java語言組

1001. 害死人不償命的(3n+1)猜想 (15/15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到n=1。卡拉茲在1950年的世界數學家大會上公

PAT (Basic Level) Practise中文1008. 陣列元素迴圈右移問題 (20)

一個數組A中存有N(N>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移M(M>=0)個位置,即將A中的資料由(A0A1……AN-1)變換為(AN-M …… AN-1 A0 A1……AN-M-1)(最後M個數迴圈移至最前面的M個位置)。如果需要考慮程式移動資料的次數儘量少,要如何

PAT (Basic Level) Practise中文 1025. 反轉連結串列 (25)

1025. 反轉連結串列 (25) 時間限制 300 ms 記憶體限制 65536 kB 程式碼長度限制 8000 B 判題程式 Standard 作者 CHEN, Yue 給定一個常數K以及一個單鏈表L,請編寫程式將L中每K個結點反轉。

PAT (Basic Level) Practise中文1002. 寫出這個數 (20)

讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。 輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。 輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後一個拼音數字後沒有空格。 輸入樣例: 123456789098

PAT (Basic Level) Practise中文1015. 德才論(3種方法

宋代史學家司馬光在《資治通鑑》中有一段著名的“德才論”:“是故才德全盡謂之聖人,才德兼亡謂之愚人,德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。” 現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。 輸入格式: 輸入第1行給出3個正整數,分別為:

PAT (Basic Level) Practise中文1026. 程式執行時間

要獲得一個C語言程式的執行時間,常用的方法是呼叫標頭檔案time.h,其中提供了clock()函式,可以捕捉從程式開始執行到clock()被呼叫時所耗費的時間。這個時間單位是clock tick,即“時鐘打點”。同時還有一個常數CLK_TCK,給出了機器時鐘每秒所走的時鐘

PAT (Basic Level) Practise中文 1077. 互評成績計算 (20)

在浙大的計算機專業課中,經常有互評分組報告這個環節。一個組上臺介紹自己的工作,其他組在臺下為其表現評分。最後這個組的互評成績是這樣計算的:所有其他組的評分中,去掉一個最高分和一個最低分,剩下的分數取平均分記為 G1;老師給這個組的評分記為 G2。該組得分為 (G1+G2)/2,最後結果四捨五入後保留整數分

PAT (Basic Level) Practise中文1025. 反轉連結串列 (25)

給定一個常數K以及一個單鏈表L,請編寫程式將L中每K個結點反轉。例如:給定L為1→2→3→4→5→6,K為3,則輸出應該為3→2→1→6→5→4;如果K為4,則輸出應該為4→3→2→1→5→6,即最後不到K個元素不反轉。 輸入格式: 每個輸入包含1個測試用例。每個測試用例第1行給出第1個結點的地址、結

PAT (Basic Level) Practise1~10

call ++ 真的 evel -a namespace cal 多少 all 1001. 害死人不償命的(3n+1)猜想 (15) 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麽把它砍掉一半;如果它是奇數,那麽把(3n+1)砍掉一半。這樣一直反復砍

PAT(Basic Level)Practise-----1001

PAT(Basic Level)Practise—–1001. 害死人不償命的(3n+1)猜想 卡拉茲(Callatz)猜想: 對任何一個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步

PAT (Basic Level) Practice (中文1001

1001 害死人不償命的(3n+1)猜想 (15 分) 卡拉茲(Callatz)猜想: 對任何一個正整數 n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把 (3n+1) 砍掉一半。這樣一直反

PAT (Basic Level) Practice (中文1002

pla flow ati soft ali 輸出 pan 自然數 include 1002 寫出這個數 (20 分) 讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。 輸入格式: 每個測試輸入包含 1 個測試用例,即給出自然數 n 的值。這裏保證

PAT (Basic Level) Practice (中文1005 繼續(3n+1)猜想 (25 分_C語言實現

題目地址 題目解析:這裡我的處理方式有一定簡潔性,可供參考。 我的程式碼: #include<stdio.h> int main() { int n,aa[101]={0};//構建包含下標2-100的陣列(輸入的數字的範圍)記錄每次運算的情況 scanf