PAT甲级刷题记录(1071-1080)

1071-1080

1071 Speech Patterns(25)

#include<iostream>
#include<map>
#include<cctype>
using namespace std;

map<string, int> m;
int main(){
    string s;
    getline(cin, s);
    string temp = "";
    for(int i = 0; i < s.length(); i++){
//         if((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= '0' && s[i] <= '9')){
//             temp += tolower(s[i]);
//         }else{
//             if(temp != ""){
//                 m[temp]++;
//                 temp = "";
//             }
//         }
//         if(i == s.length() - 1){
//             if(temp != ""){
//                 m[temp]++;
//             }
//         }
        if(isalnum(s[i])){
            temp += tolower(s[i]);
        }
        if(!isalnum(s[i]) || i == s.length() - 1){
            if(temp.length() != 0){
                m[temp]++;
            }
            temp = "";
        }
    }
    int maxn = -1;
    string res;
    for(auto it = m.begin(); it != m.end(); it++){
        if(it -> second >  maxn){
            maxn = it -> second;
            res = it -> first;
        }
    }
    cout << res << " " << maxn;
    
}

1072 Gas Station(30)

//跑测试样例跑出来数3.2 但是能AC
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1020;
const int INF = 1e9;
int adj[maxn][maxn], dis[maxn];
bool visit[maxn] = {false};

int n, m, k, ds;
int change(string p){
    int res;
    if(p[0] == 'G'){
        res = stoi(p.substr(1)) + n;
    }else{
        res = stoi(p);
    }
    return res;
}

int main(){
    fill(adj[0], adj[0] + maxn * maxn, INF);
    fill(dis, dis + maxn, INF);
    cin >> n >> m >> k >> ds;
    
    string p1, p2;
    int v1, v2;
    int dist;
    for(int i = 1; i <=k ; i++){
        cin >> p1 >> p2 >> dist;
        v1 = change(p1);
        v2 = change(p2);
        adj[v1][v2] = adj[v2][v1] = dist;
    }
    //最后结果
    int ansid = -1;
    double ansdis = -1, ansaver = INF;
    //遍历所有gas station寻找最优结果
    for(int index = n + 1; index <= n + m; index++){
        double mindis = INF, aver = 0;//当前station的结果
        fill(dis, dis + maxn, INF);
        fill(visit, visit + maxn, false);
        dis[index] = 0;
        //更新全部节点的距离
        for(int i = 0; i < n + m; i++){
            int u = -1, minn = INF;
            //寻找当前最近的节点
            for(int j = 1; j <= n + m; j++){
                if(!visit[j] && dis[j] < minn){
                    u = j;
                    minn = dis[j];
                }
            }
            if(u == -1){
                break;
            }
            visit[u] = true;
            //更新距离
            for(int v = 1; v <= n + m; v++){
                if(!visit[v] && dis[v] > dis[u] + adj[u][v]){
                    dis[v] = dis[u] + adj[u][v];
                }
            }
        }
        //更新完后 计算最小值与平均值
        for(int i = 1; i <= n; i++){
            //如果存在节点仍然超出距离,那就说明该station不行
            if(dis[i] > ds){
                mindis = -1;
                break;
            }
            if(dis[i] < mindis){
                mindis = dis[i];
            }
            aver += 1.0 * dis[i];
        }
        if(mindis == -1){
            continue;
        }
        aver /= n;
        //更新最终结果
        if(mindis > ansdis){
            ansid = index;
            ansdis = mindis;
            ansaver = aver;
        }else if(mindis == ansdis && aver < ansaver){
            ansid = index;
            ansaver = aver;
        }
    }
    if(ansid == -1){
        cout << "No Solution";
    }else{
        printf("G%d\n%.1f %.1f", ansid -n, ansdis, ansaver);
    }
    return 0;
}

1073 Scientific Notation(20)

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int main(){
    string s;
    cin >> s;
    if(s[0] == '-'){
        cout << '-';
    }
    int pos = 0;
    while(s[pos] != 'E'){
        pos++;
    }
    string num = s.substr(1, pos - 1);
    int power = stoi(s.substr(pos + 1));
    if(power < 0){
    	cout << "0.";
		for(int i = 0; i < abs(power) - 1; i++){
            cout << 0;
        }
		for(int i = 0; i < num.size(); i++){
            if (num[i] != '.')cout << num[i];
        }
    }else{
        cout << num[0];
        int j, cnt;
        for(j = 2, cnt = 0; j < num.length() && cnt < power; j++, cnt++){
            cout << num[j];
        }
        if(j == num.length()){
            for(int k = 0; k < power -cnt; k++){
                cout << 0;
            }
        }else{
            cout << ".";
            for(int k = j; k< num.length(); k++){
                cout << num[k];
            }
        }
    }
    return 0;
}

1074 Reversing Linked List(25)

#include<iostream>
#include<stack>
#include<vector>
using namespace std;
const int maxn = 1e5 + 1;

struct node{
    int address, data, next;
}nums[maxn];

int main(){
    int start, n, k;
    cin >> start >> n >> k;
    int ad, da, ne;
    for(int i = 1; i <= n; i++){
        cin >> ad >> da >> ne;
        nums[ad].address = ad;
        nums[ad].data = da;
        nums[ad].next = ne;
    }
    int cnt = 0;
    stack<node> s;
    vector<node> res;
    while(start != -1){
        node num = nums[start];
        s.push(num);
        cnt++;
        start = num.next;
        if(cnt == k){
            while(!s.empty()){
                node temp = s.top();
                res.push_back(temp);
                s.pop();
            }
            cnt = 0;
        }
    }
    if(!s.empty()){
        stack<node> temp_s;
        while(!s.empty()){
            temp_s.push(s.top());
            s.pop();
        }
        while(!temp_s.empty()){
            res.push_back(temp_s.top());
            temp_s.pop();
        }
    }
    for(int i = 0; i < res.size(); i++){
        if(i == 0){
            printf("%05d %d ", res[i].address, res[i].data);
        }else{
            printf("%05d\n%05d %d ",res[i].address, res[i].address, res[i].data);
        }
    }
    cout << -1;
}

1075 PAT Judge(25)

// //测试点4过不了
// //用户如果提交了拿了0分, 那也参与排名
// //只有全部题目都未提交或者提交的都未通过编译,才不能参与排名
// #include<iostream>
// #include<map>
// #include<algorithm>
// using namespace std;
// const int maxn = 1e4 + 1;
// struct student{
//     int id, total_score;
//     map<int,int> scores;
//     int sort_flag;
//     student(){
//         id = 0;
//         total_score = 0;
//         sort_flag = 0;
//     }
// }stu[maxn];

// int marks[10];
// int n, k, m;

// bool cmp(student s1, student s2){
//     if(s1.sort_flag != s2.sort_flag){
//         return s1.sort_flag > s2.sort_flag;
//     }
//     if(s1.total_score != s2.total_score){
//         return s1.total_score > s2.total_score;
//     }
//     int prefect_s1 = 0, prefect_s2 = 0;
    
//     for(int i = 1; i <= k; i++){
//         if(s1.scores.count(i) && s1.scores[i] == marks[i]){
//             prefect_s1++;
//         }
//         if(s2.scores.count(i) && s2.scores[i] == marks[i]){
//             prefect_s2++;
//         }
//     }
//     if(prefect_s1 != prefect_s2){
//         return prefect_s1 > prefect_s2;
//     }
//     return s1.id < s2.id;
// }
// int main(){
//     cin >> n >> k >> m;
//     for(int i = 1; i <= k; i++){
//         cin >> marks[i];
//     }
//     for(int i = 1; i <= n; i++){
//         stu[i].id = i;
//     }
//     int uid, pid, pscore;
//     for(int i = 1; i <= m; i++){
//         cin >> uid >> pid >> pscore;
//         if(stu[uid].scores.count(pid)){
//             if(stu[uid].scores[pid] < pscore){
//                 stu[uid].scores[pid] = pscore;
//             }
//         }else{
//             if(pscore == -1){
//                 stu[uid].scores[pid] = 0;
//             }else{
//                 stu[uid].scores[pid] = pscore; 
// // 测试点2 提交后为0分参与排序
// //                 if(pscore != 0){
// //                     stu[uid].sort_flag = 1;
// //                 }
//                 stu[uid].sort_flag = 1;
//             }
//         }
//     }
//     for(int i = 1; i <= n; i++){
//         for(auto it = stu[i].scores.begin(); it != stu[i].scores.end(); it++){
//             stu[i].total_score += it -> second;
//         }
//     }
//     sort(stu + 1, stu + 1 + n, cmp);
//     int rk = 0;
//     int len = 1;
//     int now_total_score = -1;
//     for(int i = 1; i <= n; i++){
//         if(stu[i].sort_flag == 0){
//             break;
//         }
//         if(stu[i].total_score != now_total_score){
//             now_total_score = stu[i].total_score;
//             rk += len;
//             len = 1;
//         }else{
//             len++;
//         }
//         printf("%d %05d %d", rk, stu[i].id, stu[i].total_score);
//         for(int j = 1; j <= k; j++){
//             cout << " ";
//             if(stu[i].scores.count(j)){
//                 cout << stu[i].scores[j];
//             }else{
//                 cout << "-";
//             }
//         }
//         cout << endl;
//     }
//     return 0;
// }

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
    int rank, id, total = 0;
    vector<int> score;
    int passnum = 0;
    bool isshown = false;
};
bool cmp1(node a, node b) {
    if(a.total != b.total)
        return a.total > b.total;
    else if(a.passnum != b.passnum)
        return a.passnum > b.passnum;
    else
        return a.id < b.id;
}

int main() {
    int n, k, m, id, num, score;
    scanf("%d %d %d", &n, &k, &m);
    vector<node> v(n + 1);
    for(int i = 1; i <= n; i++)
        v[i].score.resize(k + 1, -1);
    vector<int> full(k + 1);
    for(int i = 1; i <= k; i++)
        scanf("%d", &full[i]);
    for(int i = 0; i < m; i++) {
        scanf("%d %d %d", &id, &num, &score);
        v[id].id = id;
        v[id].score[num] = max(v[id].score[num], score);
        if(score != -1)
            v[id].isshown = true;
        else if(v[id].score[num] == -1)
            v[id].score[num] = -2;
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= k; j++) {
            if(v[i].score[j] != -1 && v[i].score[j] != -2)
                v[i].total += v[i].score[j];
            if(v[i].score[j] == full[j])
                v[i].passnum++;
        }
    }
    sort(v.begin() + 1, v.end(), cmp1);
    for(int i = 1; i <= n; i++) {
        v[i].rank = i;
        if(i != 1 && v[i].total == v[i - 1].total)
            v[i].rank = v[i - 1].rank;
    }
    for(int i = 1; i <= n; i++) {
        if(v[i].isshown == true) {
            printf("%d %05d %d", v[i].rank, v[i].id, v[i].total);
            for(int j = 1; j <= k; j++) {
                if(v[i].score[j] != -1 && v[i].score[j] != -2)
                    printf(" %d", v[i].score[j]);
                else if(v[i].score[j] == -1)
                    printf(" -");
                else
                    printf(" 0");
            }
            printf("\n");
        }
    }
    return 0;
}

1076 Forwards on Weibo(30)

#include<iostream>
#include<vector>
using namespace std;
const int maxn = 1e3 + 1;
struct user{
    vector<int> followers;
    int index;
    user(){
        index = 0;
    }
}u[maxn];
bool visit[maxn] = {false};
int main(){
    int n, l, k; 
    cin >> n >> l;
    for(int i = 1; i <= n; i++){
        u[i].index = i;
    }
    int len, temp;
    for(int i = 1; i <= n; i++){
        cin >> len;
        for(int j = 1; j <= len; j++){
            cin >> temp;
            u[temp].followers.push_back(i);
        }
    }
    //query
    int query_u;
    cin >> k;
    for(int i = 1; i <= k; i++){
        cin >> query_u;
        fill(visit, visit + maxn, false);
        visit[query_u] = true;//最后再减掉
        vector<int> friends;
        vector<int> newfriends;
        newfriends.push_back(query_u);
        
        for(int level = 1; level <= l; level++){
            friends = newfriends;
            for(int j = 0; j < friends.size(); j++){
                query_u = friends[j];
                for(int t = 0; t < u[query_u].followers.size(); t++){
                    if(visit[u[query_u].followers[t]] == false){
                        newfriends.push_back(u[query_u].followers[t]);
                        visit[u[query_u].followers[t]] = true;
                    }
                }
            }
        }
        int res = 0;
        for(int i = 1; i <= n; i++){
            if(visit[i] == true){
                res++;
            }
        }
        cout << res - 1 << endl;
    }
}

1077 Kuchiguse(20)

#include<iostream>
#include<vector>
using namespace std;
vector<char> v;
const int maxn = 101;
string a[maxn];
int main(){
    int n;
    cin >> n;
    //有个换行符
    getchar();
    
    for(int i = 0; i < n; i++){
        //cin >> a[i];
        getline(cin, a[i]);
    }
    int mu = - 1;
    
    while(a[0].length() + mu >= 0){
        int flag = true; 
        int index_a0 = a[0].length() + mu;
        for(int i = 1; i < n; i++){
            int index_ai = a[i].length() + mu;
            if(index_ai < 0){
                flag = false;
                break;
            }
            if(a[0][index_a0] != a[i][index_ai]){
                flag = false;
                break;
            }else{
                continue;
            }
        }
        if(flag == false){
            break;
        }else{
            v.push_back(a[0][index_a0]);
            mu--;
        }
    }
    if(v.empty()){
        cout << "nai";
    }else{
        for(int i = v.size() - 1; i >= 0; i--){
            cout << v[i];
        }
    }
}

1078 Hashing(25)

#include<iostream>
#include<vector>
using namespace std;
const int maxn = 1e4 + 1;
bool visit[maxn];
vector<int> res;

bool isprime(int n){
    if(n <= 1){
        return false;
    }
    if(n == 2){
        return true;
    }
    for(int i = 2; i * i <= n; i++){
        if(n % i == 0){
            return false;
        }
    }
    return true;
}
int find(int tsize){
    while(!isprime(tsize)){
        tsize++;
    }
    return tsize;
}

int main(){
    fill(visit, visit + maxn, false);
    int tsize, n;
    cin >> tsize >> n;
    int temp, h;
    
    tsize = find(tsize);
    
    for(int i = 1; i <= n; i++){
        cin >> temp;
        h = temp % tsize;
        int d = 1;
        while(visit[h]){
            if(d == tsize){
                break;
            }
            h = (temp + d * d) % tsize;
            d++;
        }
        if(d != tsize){
            res.push_back(h);
            visit[h] = true;
        }else{
            res.push_back(-1);
        }
    }
    for(int i = 0; i < n; i++){
        if(i != 0){
            cout << " ";
        }
        if(res[i] == -1){
            cout << "-";
        }else{
            cout << res[i];
        }
    }
}

1079 Total Sales of Supply Chain(25)

#include<iostream>
#include<queue>
#include<cmath>
#include<vector>
using namespace std;
const int maxn = 1e5 + 1;
struct node{
    int index;
    int type;
    int level;
    vector<int> next;
    double sale;
    node(){
        index = 0;
        type = 0;
        sale = 0;
        level = 0;
    }
}su[maxn];
void getlevel(int x, int level){
    su[x].level = level;
    if(!su[x].next.empty()){
        for(int i = 0; i < su[x].next.size(); i++){
            getlevel(su[x].next[i], level + 1);
        }
    }
}
int main(){
    int n;
    double p, r;
    cin >> n >> p >> r;
    for(int i = 0; i < n; i++){
        int len, temp;
        su[i].index = i;
        cin >> len;
        if(len == 0){
            cin >> temp;
            su[i].type = 0;
            su[i].sale = temp;
        }else{
            su[i].type = 1;
            for(int j = 0; j < len; j++){
                cin >> temp;
                su[i].next.push_back(temp);
            }
        }
    }
    getlevel(0, 0);
    queue<node> q;
    q.push(su[0]);
    double res = 0.0;
    while(!q.empty()){
        node temp = q.front();
        if(temp.type != 0){
            for(int i = 0; i < temp.next.size(); i++){
                q.push(su[temp.next[i]]);
            }
        }else{
            res += temp.sale * p * pow((r/100 + 1), temp.level);
        }
        q.pop();
    }
    printf("%.1f", res);
}

1080 Graduate Admission(30)

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 4e4 + 1;
struct student{
    int index, ge, gi, grade, rank;
    vector<int> prefer;
    student(){
        index =0;
        ge = 0;
        gi = 0;
        grade = 0;
        rank = 0;
    }
}stu[maxn];
struct school{
    int quota, index;
    int last_rank;
    vector<int> accept;
    school(){
        index = 0;
        quota = 0;
        last_rank = 0;
    }
}sch[101];
int n, m, k;


bool cmp(student s1, student s2){
    if(s1.grade != s2.grade){
        return s1.grade > s2.grade;
    }else{
        return s1.ge > s2.ge;
    }
}
void setrank(){
    int rank = 0;
    int len = 1;
    int nowgrade = -1, nowge = -1;
    for(int i = 0; i < n; i++){
        if(nowgrade != stu[i].grade || nowge != stu[i].ge){
            rank += len;
            stu[i].rank = rank;
            len = 1;
            nowgrade = stu[i].grade;
            nowge = stu[i].ge;
        }else{
            len++;
            stu[i].rank = rank;
        }
    }
}
int main(){
    cin >> n >> m >> k;
    for(int i = 0; i < m; i++){
        sch[i].index = i;
        cin >> sch[i].quota;
    }
    for(int i = 0; i < n; i++){
        int temp;
        stu[i].index = i;
        cin >> stu[i].ge >> stu[i].gi;
        stu[i].grade = stu[i].ge + stu[i].gi;
        for(int j = 0; j < k; j++){
            cin >> temp;
            stu[i].prefer.push_back(temp);
        }
    }
    sort(stu, stu + n, cmp);
    setrank();
    for(int i = 0; i < n; i++){
        for(int j = 0; j < stu[i].prefer.size(); j++){
            int chosed_school  = stu[i].prefer[j];
            bool accept_flag = false;
            if(sch[chosed_school].quota != 0){
                sch[chosed_school].quota--;
                sch[chosed_school].accept.push_back(stu[i].index);
                sch[chosed_school].last_rank = stu[i].rank;
                accept_flag = true;
            }else{
                if(stu[i].rank == sch[chosed_school].last_rank){
                    sch[chosed_school].accept.push_back(stu[i].index);
                    accept_flag = true;
                }
            }
            if(accept_flag){
                break;
            }
        }
    }
    
    for(int i = 0; i < m; i++){
        if(!sch[i].accept.empty()){
            sort(sch[i].accept.begin(), sch[i].accept.end());
            for(int j = 0; j < sch[i].accept.size(); j++){
                if(j != 0){
                    cout << " ";
                }
                cout << sch[i].accept[j];
            }
        }
        cout << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值