PAT1001~1005AC代碼

晚上了,睡不着覺,作CF把,太累了,那就來幾道乙級的編程小題吧。

100一、卡拉茲(Callatz)猜測:

對任何一個正整數 n,若是它是偶數,那麼把它砍掉一半;若是它是奇數,那麼把 ( 砍掉一半。這樣一直反覆砍下去,最後必定在某一步獲得 n=1。卡拉茲在 1950 年的世界數學家大會上公佈了這個猜測,傳說當時耶魯大學師生齊動員,拼命想證實這個貌似很傻很天真的命題,結果鬧得學生們無意學業,一心只證 (,以致於有人說這是一個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……html

咱們今天的題目不是證實卡拉茲猜測,而是對給定的任一不超過 1000 的正整數 n,簡單地數一下,須要多少步(砍幾下)才能獲得 n=1?ios

輸入格式:

每一個測試輸入包含 1 個測試用例,即給出正整數 n 的值。c++

輸出格式:

輸出從 n 計算到 1 須要的步數。編程

輸入樣例:

3

輸出樣例:



AC代碼以下:5
#include <iostream>
using namespace std;
int main(){
    int N;
    cin>>N;
    int res = 0;
    while(N!=1){
        res++;
        if(N%2==0){
            N/=2;
        }
        else{
            N=3*N+1;
            N/=2;
        }
    }
    cout<<res;
    return 0;
}

1002 寫出這個數 (20 分)

 

讀入一個正整數 n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。測試

輸入格式:

每一個測試輸入包含 1 個測試用例,即給出天然數 n 的值。這裏保證 n 小於 1。flex

輸出格式:

在一行內輸出 n 的各位數字之和的每一位,拼音數字間有 1 空格,但一行中最後一個拼音數字後沒有空格。spa

輸入樣例:

1234567890987654321123456789

輸出樣例:



AC代碼:yi san wu
#include <iostream>
#include <string>
#include <map>
using namespace std;
typedef long long ll;
int main(){
    string nums;
    cin>>nums;
    ll res = 0;
    for(int i=0;i<nums.length();i++){
        res+=nums[i]-'0';
    }
    map<int,string> m;
    m[0]="ling";
    m[1]="yi";
    m[2]="er";
    m[3]="san";
    m[4]="si";
    m[5]="wu";
    m[6]="liu";
    m[7]="qi";
    m[8]="ba";
    m[9]="jiu";
    string b = to_string(res);
    for(int i=0;i<b.length();i++){
        cout<<m[b[i]-'0'];
        if(i!=b.length()-1) cout<<" ";
    }
    return 0;
}

1003 我要經過! (20 分)

 

「答案正確」是自動判題系統給出的最使人歡喜的回覆。本題屬於 PAT 的「答案正確」大派送 —— 只要讀入的字符串知足下列條件,系統就輸出「答案正確」,不然輸出「答案錯誤」。code

獲得「答案正確」的條件是:htm

  1. 字符串中必須僅有 P、 A、 T這三種字符,不能夠包含其它字符;
  2. 任意形如 xPATx 的字符串均可以得到「答案正確」,其中 x 或者是空字符串,或者是僅由字母 A 組成的字符串;
  3. 若是 aPbTc 是正確的,那麼 aPbATca 也是正確的,其中 a、 b、 c 均或者是空字符串,或者是僅由字母 A 組成的字符串。

如今就請你爲 PAT 寫一個自動裁判程序,斷定哪些字符串是能夠得到「答案正確」的。blog

輸入格式:

每一個測試輸入包含 1 個測試用例。第 1 行給出一個正整數 n (<),是須要檢測的字符串個數。接下來每一個字符串佔一行,字符串長度不超過 100,且不包含空格。

輸出格式:

每一個字符串的檢測結果佔一行,若是該字符串能夠得到「答案正確」,則輸出 YES,不然輸出 NO

輸入樣例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

輸出樣例:

YES
YES
YES
YES
NO
NO
NO
NO

AC代碼
//
// Created by GodofOrange on 2019/6/13.
//
#include <iostream>
#include <string>
using namespace std;
int main(){
    int N;
    cin>>N;
    while(N--){
        string str ="";
        cin>>str;
        int sign=0,P=0,T=0,a=0,b=0,c=0;
        for(int i=0;i<str.length();i++){
            if(str[i]!='P'&&str[i]!='A'&&str[i]!='T'){sign++;break;}
            if(str[i]=='A'&&P==0&&T==0){a++;continue;}
            if(str[i]=='P'){if(P!=0||T!=0){sign++;break;}else P++;continue;}
            if(str[i]=='A'&&P==1&&T==0){b++;continue;}
            if(str[i]=='T'){if(P==0||T!=0){sign++;break;}else T++;continue;}
            if(str[i]=='A'&&P==1&&T==1){c++;continue;}
        }
        if(P==0||b+c+a==0||T==0) sign++;
        if(sign>0) cout<<"NO"<<endl;
        else{
            if(a==c&&b==1) cout<<"YES"<<endl;
            else if(c==0||a==0) cout<<"YES"<<endl;
            else if(c%a==0&&b==c/a) {
                cout << "YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }
    }
    return 0;
}

 

1004 成績排名 (20 分)

 

讀入 n(>)名學生的姓名、學號、成績,分別輸出成績最高和成績最低學生的姓名和學號。

輸入格式:

每一個測試輸入包含 1 個測試用例,格式爲

第 1 行:正整數 n
第 2 行:第 1 個學生的姓名 學號 成績
第 3 行:第 2 個學生的姓名 學號 成績
  ... ... ...
第 n+1 行:第 n 個學生的姓名 學號 成績

其中姓名學號均爲不超過 10 個字符的字符串,成績爲 0 到 100 之間的一個整數,這裏保證在一組測試用例中沒有兩個學生的成績是相同的。

輸出格式:

對每一個測試用例輸出 2 行,第 1 行是成績最高學生的姓名和學號,第 2 行是成績最低學生的姓名和學號,字符串間有 1 空格。

輸入樣例:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

輸出樣例:


AC代碼:Mike CS991301 Joe Math990112
#include <iostream>
#include <string>
using namespace std;
int main(){
    int N;
    cin>>N;
    int max=0,min=100;
    string res1;
    string res2;
    string res3;
    string res4;
    while(N--){
        string str1 = "";
        string str2 ="";
        cin>>str1>>str2;
        int A = 0;
        cin>>A;
        if(A>=max){
            max=A;
            res1=str1;
            res2=str2;
        }
        if(A<=min){
            min=A;
            res3=str1;
            res4=str2;
        }
    }
    cout<<res1<<" "<<res2<<endl;
    cout<<res3<<" "<<res4<<endl;
    return 0;
}

 

1005 繼續(3n+1)猜測 (25 分)

 

卡拉茲(Callatz)猜測已經在1001中給出了描述。在這個題目裏,狀況稍微有些複雜。

當咱們驗證卡拉茲猜測的時候,爲了不重複計算,能夠記錄下遞推過程當中遇到的每個數。例如對 n=3 進行驗證的時候,咱們須要計算 三、五、八、四、二、1,則當咱們對 n=五、八、四、2 進行驗證的時候,就能夠直接斷定卡拉茲猜測的真僞,而不須要重複計算,由於這 4 個數已經在驗證3的時候遇到過了,咱們稱 五、八、四、2 是被 3「覆蓋」的數。咱們稱一個數列中的某個數 n 爲「關鍵數」,若是 n 不能被數列中的其餘數字所覆蓋。

如今給定一系列待驗證的數字,咱們只須要驗證其中的幾個關鍵數,就能夠沒必要再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。

輸入格式:

每一個測試輸入包含 1 個測試用例,第 1 行給出一個正整數 K (<),第 2 行給出 K 個互不相同的待驗證的正整數 n (1)的值,數字間用空格隔開。

輸出格式:

每一個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後一個數字後沒有空格。

輸入樣例:

6
3 5 6 7 8 11

輸出樣例:

7 6
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
int N = 0;
int main(){
    cin>>N;
    int *A = new int[N];
    for(int i=0;i<N;i++){
        cin>>A[i];
    }
    sort(A,A+N);
    set<int> s2;
    for (int i=N-1;i>=0;i--) {
        int r =A[i];
        while(r!=1){
            if(r%2==0){
                r/=2;
                s2.insert(r);
            }
            else{
                r=r*3+1;
                r/=2;
                s2.insert(r);
            }
        }
    }
    int *C = new int[10000];
    int sign=0;
    for(int i=N-1,j=0;i>=0;i--){
        if(s2.count(A[i])==0){
            C[j]=A[i];
            j++;
            sign++;
        }
    }
    for(int i=0;i<sign;i++){
        cout<<C[i];
        if(i!=sign-1) cout<<" ";
    }
    return 0;
}
相關文章
相關標籤/搜索