0
点赞
收藏
分享

微信扫一扫

PAT (Basic Level) Practice (中文)1001 - 1018题

路西法阁下 2022-04-08 阅读 29
c++

不严谨的地方似乎不少,所以不继续做了。
1001 害死人不偿命的(3n+1)猜想 15 146246/404798 (36.13%)

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    
    int ret = 0;
    
    while (1)
    {
        if (n == 1)
        {
            cout << ret << endl;
            break;
        }
        ret ++;
        if (n % 2 == 0) n /= 2;
        else n = (3 * n + 1) / 2;
    }
    return 0;
}

1002 写出这个数 20 95681/370330 (25.84%)

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

const string pinyin[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};

int main()
{
    string s;
    cin >> s;
    int len = s.size();
    int sum = 0;
    for (int i = 0; i < len; i ++ ) sum += (s[i] - '0');
    
    vector<int> a;
    while (sum)
    {
        int k = sum % 10;
        sum /= 10;
        a.push_back(k);
    }
    
    for (int i = a.size() - 1; i >= 0; i -- )
    {
        cout << pinyin[a[i]];
        if (i) cout << " ";
    }
    return 0;
}

1003 我要通过! 20 48686/207210 (23.50%)

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int n;
    cin >> n;
    while (n --)
    {
        string s;
        cin >> s;
        
        if (s.size() < 3)
        {
            cout << "NO" << endl;
            continue;
        }
        bool noPat = false;
        for (int i = 0; i < s.length(); i ++ ) 
            if (s[i] != 'P' && s[i] != 'A' && s[i] != 'T')
            {
                noPat =true;
                break;
            }
        if (noPat)
        {
            cout << "NO" << endl;
            continue;
        }
        int qa = 0, za = 0, ha = 0;
        int index = 0;
        // 如果不是P或者A开头,就一定是错的
        if (s[index] != 'P' && s[index] != 'A')
        {
            cout << "NO" << endl;
            continue;
        }
        
        while (index < s.size())
        {
            if (s[index++] == 'A') qa ++;
            else break;
        }
        while (index < s.size())
        {
            if (s[index++] == 'A') za ++;
            else break;
        }
        while (index < s.size())
        {
            if (s[index++] == 'A') ha ++;
            else break;
        }
        if (ha == qa * za && za) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    
    return 0;
}

1004 成绩排名 20 69672/216169 (32.23%)

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 10010;

class Student
{
public:
    string name;
    string nums;
    int grade;
    bool operator< (const Student &t)const
    {
        return grade < t.grade;
    }
};

int main()
{
    Student stu[N];
    int n;
    cin >> n;
    int k = n;
    while (n --) cin >> stu[n].name >> stu[n].nums >> stu[n].grade;
    sort(stu, stu + k);
    
    cout << stu[k - 1].name << " " << stu[k - 1].nums << endl;
    cout << stu[0].name << " " << stu[0].nums << endl;
    
    return 0;
}

1005 继续(3n+1)猜想 25 46777/177915 (26.29%)

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 101;
bool cmp(int x,int y)
{
	return x > y;
}

int main()
{
    int k, a[N];
    cin >> k;
    // 读入数据
    for (int i = 0; i < k; i ++ ) cin >> a[i];
    
    // 覆盖数
    for (int i = 0; i < k; i ++ )
    {
        // 每次迭代的数拿出来
        int n = a[i];
        // 进入循环,查看是否有覆盖的数字
        while (n != 1)
        {
            if (n % 2 == 0) n /= 2;
            else n = (3 * n + 1) / 2;
            // 有覆盖的数字给他赋值为1
            for (int j = 0; j < k; j ++ )
                if (a[j] == n) 
                    a[j] = 1;
        }
    }
    // 将不为1的数字拿出放到另一个数组
    int b[N];
    int len = 0;
    for (int i = 0; i < k; i ++ )
        if (a[i] != 1)
            b[len++] = a[i];
    sort(b, b + len,cmp);
    for (int i = 0; i < len; i ++ )
    {
        cout << b[i];
        if (i != len - 1)
            cout << " ";
    }
    
    return 0;
}

1006 换个格式输出整数 15 60635/120761 (50.21%)

#include <iostream>

using namespace std;

int main()
{
    string str;
    cin >> str;
    
    int len = str.length();
    int k = 0;
    while (len--)
    {
        if (len == 2)
        {
            int n = str[k++] - '0';
            for (int i = 0; i < n; i ++ ) cout << "B";
        }
        if (len == 1)
        {
            int n = str[k++] - '0';
            for (int i = 0; i < n; i ++ ) cout << "S";
        }
        if (len == 0)
        {
            int n = str[k++] - '0';
            for (int i = 1; i <= n; i ++ ) cout << i;
        }
    }
    return 0;
}

1007 素数对猜想 20 50322/206833 (24.33%)

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

// 思路:先读入所有小于n的素数,然后再根据判断条件寻找

int main()
{
    int n;
    cin >> n;
    vector<int> v;
    while(n >= 2)
    {
        bool isPrime = true;
        for (int i = 2; i <= sqrt(n); i ++ )
            if (n % i == 0)
                isPrime = false;
        if (isPrime) v.push_back(n);
        n --;
    }
    int ret = 0;
    for (int i = v.size() - 1; i > 0; i -- )
        if (v[i - 1] - v[i] == 2)
            ret ++;
    cout << ret << endl;
    return 0;
}

1008 数组元素循环右移问题 20 55231/170661 (32.36%)

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 101;
int main()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    m = m % n;
    // 方法1
//     for(int i = 0; i < n - m; i ++ )
//         cin >> a[m + i];
//     for (int i = 0; i < m; i ++ )
//         cin >> a[i];
//     for (int i = 0; i < n; i ++ )
//     {
//         cout << a[i];
//         if (i < n - 1) cout << " ";
//     }
    // 方法2
//     for(int i = 0; i < n; i ++ ) cin >> a[i];
//     for(int i = n - m; i < n; i ++ ) cout << a[i] << " ";
//     for(int i = 0; i < n - m; i ++ )
//     {
//         cout << a[i];
//         if (i < n - m - 1) cout << " ";
//     }
    // 方法3
    for(int i = 0; i < n; i ++ ) cin >> a[i];
     if (m != 0) {
        reverse(begin(a), begin(a) + n);
        reverse(begin(a), begin(a) + m);
        reverse(begin(a) + m, begin(a) + n);
    }
    
    for (int i = 0; i < n; i ++ )
    {
        cout << a[i];
        if (i < n - 1) cout << " ";
    }
    return 0;
}

1009 说反话 20 61704/168944 (36.52%)

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<string> v;
    string str;
    while (cin >> str) v.push_back(str);
    
    for (int i = v.size() - 1; i >= 0; i -- )
    {
        cout << v[i];
        if (i > 0) cout << " ";
    }
    
    return 0;
}

1010 一元多项式求导 25 46630/215443 (21.64%)

// 这个题的判定有点问题,看看就好
#include <iostream>

using namespace std;

int main()
{
    int a, b;
    int num = 0;
    while (cin >> a >> b && b && a)
    {
        if(num == 1) cout << " " ;
        cout << a * b << " " << b - 1;
        num = 1;
    }
    if(num == 0) cout << "0 0" ;
    
    return 0;
}

1011 A+B 和 C 15 61157/198112 (30.87%)

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int i = 1;
    while (n --)
    {
        long long a, b, c;
        cin >> a >> b >> c;
        if (a + b > c) cout << "Case #" << i++ << ": true" << endl;
        else cout << "Case #" << i++ << ": false" << endl;
    }
    return 0;
}

1012 数字分类 20 40350/180425 (22.36%)

#include <iostream>

using namespace std;

const int N = 1010;

//  sum2可能出现交错相加等于零的情况,注意一下

int main()
{
    int n, a[N];
    cin >> n;
    int sum1 = 0, sum2 = 0, ret = 0, sum3 = 0, t = 0, max = 0;
    int flag = 1;
    int k = 0;
    for (int i = 0; i < n; i ++ )
    {
        cin >> a[i];
        // A1
        if (a[i] % 5 == 0 && a[i] % 2 == 0) sum1 += a[i];
        // A2
        else if (a[i] % 5 == 1) {sum2 += flag * a[i], flag *= -1, k = 1;}
        // A3
        else if (a[i] % 5 == 2) ret ++;
        // A4
        else if (a[i] % 5 == 3) sum3 += a[i], t++;
        // A5
        else if(a[i] % 5 == 4 && max < a[i]) max = a[i];
    }
    double x;
    if (sum3 > 0) x = (double)sum3 / t;
    if (sum1) printf("%d",sum1);
    else cout << "N";
    if (k) printf(" %d",sum2);
    else cout << " N";
    if (ret) printf(" %d",ret);
    else cout << " N";
    if (sum3) printf(" %.1f",x);
    else cout << " N";
    if (max) printf(" %d\n",max);
    else cout << " N";
    
    return 0;
}

1013 数素数 20 42280/198712 (21.28%)

#include <iostream>
#include <cmath>

using namespace std;

const int N = 10010;

int main()
{
    int m, n;
    cin >> m >> n;
    int k = 0, i = 1;
    int a[N];
    while (i ++)
    {
        bool isPrime = true;
        for (int j = 2; j <= sqrt(i); j ++ )
            if (i % j == 0)
                isPrime = false;
        if (isPrime) a[k ++] = i;
        if (k > n) break;
    }
    int t = 0;
    for (int i = m; i <= n; i ++ )
    {
        t ++;
        cout << a[i - 1];
        if (t < 10 && i < n) cout << " ";
        else
        {
            t = 0;
            cout << endl;
        }
    }
    return 0;
}

1014 福尔摩斯的约会 20 33030/202066 (16.35%)

#include <iostream>
#include <vector>

using namespace std;

const string week[7] = {"MON","TUE","WED","THU","FRI","SAT","SUN"};

int hour(char a)
{
    if (isdigit(a)) return a-'0';
    else return a-'A'+10;
}
int main()
{
    string a, b, c, d;
    cin >> a >> b >> c >> d;
    vector<char> e;
    int k = 0;
    if (a.size() > b.size()) swap(a, b);
    if (c.size() > d.size()) swap(c, d);
    
    // 星期的字母是A - G
    for (int i = 0; i < a.size(); i ++ )
        if (a[i] == b[i] && a[i] <= 'G' && a[i] >= 'A')
        {
            e.push_back(a[i]);
            k = i;
            break;
        }
    
    // 小时的字母是A - E
    for (int i = k + 1; i < a.size(); i ++ )
        if (a[i] == b[i] && ((a[i] <= 'N' && a[i] >= 'A') || isdigit(a[i])))
        {
            e.push_back(a[i]);
            break;
        }
    
    for (int i = 0; i < c.size(); i ++ )
        if (c[i] == d[i] && (isupper(c[i]) || islower(c[i])))
        {
            k = i;
            break;
        }
    
    cout << week[e[0] - 'A'] << " ";
    if (hour(e[1]) < 10) printf("0%d", hour(e[1]));
    else printf("%d", hour(e[1]));
    
    if (k < 10) printf(":0%d", k);
    else printf(":%d", k);
    
    return 0;
}

1015 德才论 25 28370/128811 (22.02%)

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

class info
{
public:
    char nums[10];
    int de_s, cai_s, sum;
    int clas; // 等级
}stu[100010];

bool cmp(info a, info b)
{
    if (a.clas != b.clas) return a.clas < b.clas;// 如果考生档次不同,按照从高到低
    else if (a.sum != b.sum) return a.sum > b.sum; // 如果考生档次相同,按照总分从高到低排序
    else if (a.de_s != b.de_s) return a.de_s > b.de_s;// 如果考生分数相同,按照德行分从高到底
    else return strcmp(a.nums, b.nums) < 0; // 如果德行分相同,按照考生号排序
}

int main()
{
    int N, L, H;
    cin >> N >> L >> H;
    int cnt = N;
    for (int i = 0; i < N; i ++ )
    {
        cin >> stu[i].nums >> stu[i].de_s >> stu[i].cai_s;
        stu[i].sum = stu[i].de_s + stu[i].cai_s;
        // 德才兼亡,且无法及格
        if(stu[i].de_s < L||stu[i].cai_s < L) {stu[i].clas = 5;cnt--;}
        // 德才全尽
        else if(stu[i].de_s >= H && stu[i].cai_s >= H) stu[i].clas = 1;
        // 德胜才
        else if(stu[i].de_s >= H && stu[i].cai_s < H) stu[i].clas = 2;
        // 德才兼亡但尚有德胜才者
        else if(stu[i].de_s < H && stu[i].cai_s <H && stu[i].de_s>=stu[i].cai_s) stu[i].clas = 3;
        // 德才兼亡但才胜德
        else stu[i].clas = 4;
    }
    cout << cnt << endl;
    sort(stu,stu+N,cmp);
    for(int i=0;i<cnt;i++)
        printf("%s %d %d\n",stu[i].nums,stu[i].de_s,stu[i].cai_s);
    
    return 0;
}

1016 部分A+B 15 45989/92469 (49.73%)

#include <iostream>
#include <cstring>

using namespace std;

const int N = 10;

int main()
{
    char a[N], b[N], da, db;
    cin >> a >> da >> b >> db;
    int sum1 = 0, sum2 = 0;
    for (int i = 0; i < strlen(a); i ++ )
        if (a[i] == da)
            sum1 = sum1 * 10 + (da - '0');
    for (int i = 0; i < strlen(b); i ++ )
        if (b[i] == db)
            sum2 = sum2 * 10 + (db - '0');
    sum1 = sum1 + sum2;
    cout << sum1 << endl;
    return 0;
}

1017 A除以B 20 31266/107527 (29.08%)

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector<int> div(vector<int> &A, int b, int &r)
{
    vector<int> C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(),C.end());
    
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    
    return C;
}

int main()
{
    string a;
    int b;
    cin >> a >> b;
    
    vector<int> A;
    for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
    
    int r;
    auto C = div(A, b, r);
    
    for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
    cout << ' ' << r << endl;
    
    return 0;
}

1018 锤子剪刀布 20 31034/113566 (27.33%)

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int jiawin = 0, yiwin = 0;
    int jia[3] = {0}, yi[3] = {0};
    for (int i = 0; i < n; i++) {
        char s, t;
        cin >> s >> t;
        if (s == 'B' && t == 'C') {
            jiawin++;
            jia[0]++;
        } else if (s == 'B' && t == 'J') {
            yiwin++;
            yi[2]++;
        } else if (s == 'C' && t == 'B') {
            yiwin++;
            yi[0]++;
        } else if (s == 'C' && t == 'J') {
            jiawin++;
            jia[1]++;
        } else if (s == 'J' && t == 'B') {
            jiawin++;
            jia[2]++;
        } else if (s == 'J' && t == 'C') {
            yiwin++;
            yi[1]++;
        }
    }
    cout << jiawin << " " << n - jiawin - yiwin << " " << yiwin << endl << yiwin << " " << n - jiawin - yiwin << " " << jiawin << endl;
    int maxjia = jia[0] >= jia[1] ? 0 : 1;
    maxjia = jia[maxjia] >= jia[2] ? maxjia : 2;
    int maxyi = yi[0] >= yi[1] ? 0 : 1;
    maxyi = yi[maxyi] >= yi[2] ? maxyi : 2;
    char str[4] = {"BCJ"};
    cout << str[maxjia] << " " << str[maxyi];
    return 0;
}
举报

相关推荐

0 条评论