1. 程式人生 > >CCCC練習題的題解-給新人看的

CCCC練習題的題解-給新人看的

我分到的是模4餘0和餘1的題目


L1-001

int main()
{
    cout<<"Hello World!"<<endl;
    return 0;
}


L1-004

int main()
{
    int f; scanf("%d", &f);
    printf("Celsius = %d\n", 5*(f-32)/9);
    return 0;
}

L1-005. 考試座位號

時間限制 200 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard
作者 陳越

每個PAT考生在參加考試時都會被分配兩個座位號,一個是試機座位,一個是考試座位。正常情況下,考生在入場時先得到試機座位號碼,入座進入試機狀態後,系統會顯示該考生的考試座位號碼,考試時考生需要換到考試座位就座。但有些考生遲到了,試機已經結束,他們只能拿著領到的試機座位號碼求助於你,從後臺查出他們的考試座位號碼。

輸入格式:

輸入第一行給出一個正整數N(<=1000),隨後N行,每行給出一個考生的資訊:“准考證號 試機座位號 考試座位號”。其中准考證號由14位數字組成,座位從1到N編號。輸入保證每個人的准考證號都不同,並且任何時候都不會把兩個人分配到同一個座位上。

考生資訊之後,給出一個正整數M(<=N),隨後一行中給出M個待查詢的試機座位號碼,以空格分隔。

輸出格式:

對應每個需要查詢的試機座位號碼,在一行中輸出對應考生的准考證號和考試座位號碼,中間用1個空格分隔。

輸入樣例:
4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4
輸出樣例:
10120150912002 2
10120150912119 1

建立第二個數和第一個數的對映以及第二個數和第三個數的對映

const int maxn = 1010;
int mmap1[maxn];
string mmap2[maxn];
int main()
{
    int n; scanf("%d", &n);
    rep(i, n){
        string s; int x, y;
        cin>>s;scanf("%d%d", &x, &y);
        mmap1[x] = y; mmap2[x] = s;
    }
    int m; scanf("%d", &m);
    rep(i, m){
        int x; scanf("%d", &x);
        printf("%s %d\n", mmap2[x].c_str(), mmap1[x]);
    }
    return 0;
}

L1-008. 求整數段和

時間限制 400 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 楊起帆

給定兩個整數A和B,輸出從A到B的所有整數以及這些數的和。

輸入格式:

輸入在一行中給出2個整數A和B,其中-100<=A<=B<=100,其間以空格分隔。

輸出格式:

首先順序輸出從A到B的所有整數,每5個數字佔一行,每個數字佔5個字元寬度,向右對齊。最後在一行中輸出全部數字的和。

輸入樣例:
-3 8
輸出樣例:
   -3   -2   -1    0    1
    2    3    4    5    6
    7    8
Sum = 30
這題一是注意%5d的運用,二是注意換行,尤其是輸出完之後的額外一次換行
int main()
{
    int l,r; scanf("%d%d", &l, &r);
    For(i, l, r){
        printf("%5d", i);
        if ((i-l) % 5 == 4) pn;
    }
    if ((r-l) % 5 != 4) pn;
    printf("Sum = %d\n", (l+r) * (r-l+1) / 2);
    return 0;
}

L1-009. N個數求和

時間限制 400 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越

本題的要求很簡單,就是求N個數字的和。麻煩的是,這些數字是以有理數“分子/分母”的形式給出的,你輸出的和也必須是有理數的形式。

輸入格式:

輸入第一行給出一個正整數N(<=100)。隨後一行按格式“a1/b1 a2/b2 ...”給出N個有理數。題目保證所有分子和分母都在長整型範圍內。另外,負數的符號一定出現在分子前面。

輸出格式:

輸出上述數字和的最簡形式 —— 即將結果寫成“整數部分 分數部分”,其中分數部分寫成“分子/分母”,要求分子小於分母,且它們沒有公因子。如果結果的整數部分為0,則只輸出分數部分。

輸入樣例1:
5
2/5 4/15 1/30 -2/60 8/3
輸出樣例1:
3 1/3
輸入樣例2:
2
4/3 2/3
輸出樣例2:
2
輸入樣例3:
3
1/3 -1/6 1/8
輸出樣例3:
7/24
一個很不好做的模擬題,首先要寫一個比較簡單的分數類,過載一個加法
struct frac{
    int up, down;
    frac(int _up = 0, int _down = 0) : up(_up), down(_down){}
    frac operator + (const frac& b){
        frac tmp; 
        tmp.down = down * b.down;
        tmp.up = up * b.down + down * b.up;
        int gcd1 = gcd(abs(tmp.up), abs(tmp.down));
        tmp.down /= gcd1; tmp.up /= gcd1;
        return tmp;
    }
};

這當中還要用到數論中的gcd

然後讀入進行模擬,這題的輸出要分5種情況

1、答案是0

2、分母是1

3、真分數

4、正假分數

5、負假分數

對於第五種情況,題面沒有說清楚應該怎麼輸出,比如-11/3是輸出-4+1/3還是-3-2/3呢?

這個經過探索,應該用第二種處理方式

int gcd(int a, int b){
    return a % b == 0 ? b : gcd(b, a % b);
}
struct frac{
    int up, down;
    frac(int _up = 0, int _down = 0) : up(_up), down(_down){}
    frac operator + (const frac& b){
        frac tmp; 
        tmp.down = down * b.down;
        tmp.up = up * b.down + down * b.up;
        int gcd1 = gcd(abs(tmp.up), abs(tmp.down));
        tmp.down /= gcd1; tmp.up /= gcd1;
        return tmp;
    }
};
frac a[1000];
int main(){
    int n; scanf("%d", &n);
    rep(i, n) scanf("%d/%d", &a[i].up, &a[i].down);
    frac ans; ans = frac(0,1);
    rep(i, n)  ans = ans + a[i];
    if (ans.up == 0) printf("0");
    else if (ans.down == 1) printf("%d", ans.up);
    else if (abs(ans.up) < ans.down) printf("%d/%d", ans.up, ans.down);
    else if (ans.up > 0){
        int z1 = ans.up / ans.down;
        ans.up %= ans.down;
        printf("%d %d/%d", z1, ans.up, ans.down);
    }else{
        ans.up = -ans.up;
        int z1 = ans.up / ans.down;
        ans.up %= ans.down;
        printf("-%d %d/%d", z1, ans.up, ans.down);
    }
    return 0;
}

L1-012. 計算指數

時間限制 400 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越

真的沒騙你,這道才是簡單題 —— 對任意給定的不超過10的正整數n,要求你輸出2n。不難吧?

輸入格式:

輸入在一行中給出一個不超過10的正整數n。

輸出格式:

在一行中按照格式“2^n = 計算結果”輸出2n的值。

輸入樣例:
5
輸出樣例:
2^5 = 32

記得用位運算。

int main()
{
    int n;scanf("%d", &n);
    printf("%d^%d = %d", 2, n, 1<<n); 
    return 0;
}

L1-013

int main()
{
    int n; scanf("%d", &n);
    int sum = 0, mul = 1;
    rep1(i, n){
        mul *= i;
        sum += mul;
    }
    printf("%d\n", sum);
    return 0;
}

L1-016. 查驗身份證

時間限制 400 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越

一個合法的身份證號碼由17位地區、日期編號和順序編號加1位校驗碼組成。校驗碼的計算規則如下:

首先對前17位數字加權求和,權重分配為:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然後將計算的和對11取模得到值Z;最後按照以下關係對應Z值與校驗碼M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

現在給定一些身份證號碼,請你驗證校驗碼的有效性,並輸出有問題的號碼。

輸入格式:

輸入第一行給出正整數N(<= 100)是輸入的身份證號碼的個數。隨後N行,每行給出1個18位身份證號碼。

輸出格式:

按照輸入的順序每行輸出1個有問題的身份證號碼。這裡並不檢驗前17位是否合理,只檢查前17位是否全為數字且最後1位校驗碼計算準確。如果所有號碼都正常,則輸出“All passed”。

輸入樣例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
輸出樣例1:
12010X198901011234
110108196711301866
37070419881216001X
輸入樣例2:
2
320124198808240056
110108196711301862
輸出樣例2:
All passed
模擬題,那些權重分配用陣列初始化是最方便的。

順帶一提,第一個權重分配其實不用都抄,是有規律的

char s[100];
int map1[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char map2[] = "10X98765432";
int main()
{
    int n; scanf("%d", &n);
    int flag = 1;
    rep(i, n){
        scanf("%s", s);
        int sum = 0;
        rep(i, 17) sum += map1[i] * (s[i] - '0');
        sum %= 11;
        if (s[17] != map2[sum]){
            flag = 0;
            printf("%s\n", s);
        }
    }
    if (flag) printf("All passed\n");
    return 0;
}


L1-017. 到底有多二

時間限制 400 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越

一個整數“犯二的程度”定義為該數字中包含2的個數與其位數的比值。如果這個數是負數,則程度增加0.5倍;如果還是個偶數,則再增加1倍。例如數字“-13142223336”是個11位數,其中有3個2,並且是負數,也是偶數,則它的犯二程度計算為:3/11*1.5*2*100%,約為81.82%。本題就請你計算一個給定整數到底有多二。

輸入格式:

輸入第一行給出一個不超過50位的整數N。

輸出格式:

在一行中輸出N犯二的程度,保留小數點後兩位。

輸入樣例:
-13142223336
輸出樣例:
81.82%

模擬題

char s[100];
int main()
{
    scanf("%s", s);
    int len = s[0] == '-' ? strlen(s) - 1 : strlen(s);
    double base = 1;
    if (s[0] == '-') base *= 1.5;
    if ( (s[strlen(s)-1] - '0') % 2 == 0) base *= 2;
    int cnt = 0;
    rep(i, strlen(s)) if ( (s[i] - '0') == 2) ++cnt;
    base = base * cnt / len;
    printf("%.2f%\n", base * 100);
    return 0;
}

L1-020. 帥到沒朋友

時間限制 200 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越

當芸芸眾生忙著在朋友圈中發照片的時候,總有一些人因為太帥而沒有朋友。本題就要求你找出那些帥到沒有朋友的人。

輸入格式:

輸入第一行給出一個正整數N(<=100),是已知朋友圈的個數;隨後N行,每行首先給出一個正整數K(<=1000),為朋友圈中的人數,然後列出一個朋友圈內的所有人——為方便起見,每人對應一個ID號,為5位數字(從00000到99999),ID間以空格分隔;之後給出一個正整數M(<=10000),為待查詢的人數;隨後一行中列出M個待查詢的ID,以空格分隔。

注意:沒有朋友的人可以是根本沒安裝“朋友圈”,也可以是隻有自己一個人在朋友圈的人。雖然有個別自戀狂會自己把自己反覆加進朋友圈,但題目保證所有K超過1的朋友圈裡都至少有2個不同的人。

輸出格式:

按輸入的順序輸出那些帥到沒朋友的人。ID間用1個空格分隔,行的首尾不得有多餘空格。如果沒有人太帥,則輸出“No one is handsome”。

注意:同一個人可以被查詢多次,但只輸出一次。

輸入樣例1:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
輸出樣例1:
10000 88888 23333
輸入樣例2:
3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
輸出樣例2:
No one is handsome
模擬題

一是注意注意%05d的運用

二是每個人至多被查詢一次

三是怎麼輸出,因為行末要求沒有空格的,我的做法就是輸出第一個答案的時候不輸出空格,其他數先輸出一個空格

int vis[100010];
int main()
{
    int n; scanf("%d", &n);
    rep(i, n){
        int k,x; scanf("%d", &k);
        rep(i, k){
            scanf("%d", &x);
            if (k != 1)vis[x] = 1;
        }
    }
    int m; scanf("%d", &m);
    int flag = 0;
    rep(i, m) {
        int x; scanf("%d", &x);
        if (vis[x] == 0){
            vis[x] = 1;
            if (flag) printf(" ");
            printf("%05d", x);
            flag = 1;
        }
    }
    if (flag == 0) printf("No one is handsome\n");
    return 0;
}


L1-021

int main()
{
    rep(i, 3) printf("I'm gonna WIN!\n"); 
    return 0;
}

L1-024

int main()
{
    int x; scanf("%d", &x);
    printf("%d\n", (x+1) % 7 + 1);
    return 0;
}

L2-001. 緊急救援

時間限制 200 ms
記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越

作為一個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助電話給你的時候,你的任務是帶領你的救援隊儘快趕往事發地,同時,一路上召集儘可能多的救援隊。

輸入格式