记一些PAT题目(六)

A1051 Pop Sequence

#include <iostream>
#include <stack>

using namespace std;

int main(){
    int m, n, k;
    cin>>m>>n>>k;
    for (int i=0; i<k; i++){
        stack<int> s;
        int cur = 1, flag = 0;
        for (int j=0; j<n; j++){
            int t;
            cin>>t;
            for (int k=cur; k<=t; k++)
                s.push(k);
            cur = max(cur, t+1);
            if (s.size() > m || s.top() != t)
                flag = 1;
            else
                s.pop();
        }
        if (flag) cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
}

A1052 Linked List Sorting

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

using namespace std;

typedef struct{
    int address, val, next;
}Node;

int cmp(Node a, Node b){
    return a.val < b.val;
}

int main(){
    int n, head;
    cin>>n>>head;
    Node node[100001];
    for (int i=0; i<n; i++){
        int address;
        cin>>address;
        node[address].address = address;
        cin>>node[address].val>>node[address].next;
    }
    vector<Node> nodes;
    while(head != -1){
        nodes.push_back(node[head]);
        head = node[head].next;
    }
    if (!nodes.size()){
        cout<<"0 -1";
        return 0;
    }
    sort(nodes.begin(), nodes.end(), cmp);
    printf("%d %05d\n", nodes.size(), nodes[0].address);
    for (int i=0; i<nodes.size()-1; i++)
        printf("%05d %d %05d\n", nodes[i].address, nodes[i].val, nodes[i+1].address);
    printf("%05d %d -1", nodes[nodes.size()-1].address, nodes[nodes.size()-1].val);
}

A1053 Path of Equal Weight

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

using namespace std;
int s, total = 0, pn=0, weight[101]{};
vector<int> child[101], paths[101], path;

void dfs(int cur){
    path.push_back(weight[cur]);
    total += weight[cur];
    if (total == s && !child[cur].size()){
        paths[pn++] = path;
    }
    for (int i: child[cur])
        dfs(i);
    path.pop_back();
    total -= weight[cur];
}

int cmp(vector<int> a, vector<int> b){
    int size = min(a.size(), b.size());
    for (int i=0; i<size; i++){
        if (a[i] == b[i])
            continue;
        else
            return a[i] > b[i];
    }
    return 0;
}

int main(){
    int n, m;
    cin>>n>>m>>s;
    for (int i=0; i<n; i++)
        cin>>weight[i];
    for (int i=0; i<m; i++){
        int cur, t;
        cin>>cur>>t;
        for (int j=0; j<t; j++){
            int num;
            cin>>num;
            child[cur].push_back(num);
        }
    }
    dfs(0);
    sort(paths, paths+pn, cmp);
    for (int i=0; i<pn; i++){
        for (int j=0; j<paths[i].size(); j++){
            cout<<paths[i][j];
            if (j != paths[i].size()-1)
                cout<<" ";
        }
        cout<<endl;
    }
}

A1054 The Dominant Color

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

int main(){
    int m, n, maxtime = 0, dmcolor;
    cin>>m>>n;
    map<int, int> time; 
    for (int i=0; i<n; i++){
        for (int j=0; j<m; j++){
            int color;
            cin>>color;
            if (!time.count(color))
                time[color] = 1;
            else
                time[color]++;
        }
    }
    for (auto &it: time){
        if (it.second > maxtime){
            maxtime = it.second;
            dmcolor = it.first;
        }
    }
    cout<<dmcolor;
}

A1055 The World’s Richest

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

typedef struct{
    char name[10];
    int age, worth;
}Person;

int cmp(Person a, Person b){
    if (a.worth == b.worth){
        if (a.age == b.age)
            return strcmp(a.name, b.name) < 0;
        return a.age<b.age;
    }
    return a.worth > b.worth;
}

int main(){
    int n, k;
    cin>>n>>k;
    Person persons[n];
    for (int i=0; i<n; i++){
        scanf("%s %d %d", persons[i].name, &persons[i].age, &persons[i].worth);
    }
    sort(persons, persons+n, cmp);
    for (int i=0; i<k; i++){
        int out, amin, amax, size = 0, flag = 0;
        scanf("%d %d %d", &out, &amin, &amax);
        printf("Case #%d:\n", i+1);
        for (int j=0; j<n; j++)
            if (persons[j].age>=amin && persons[j].age<=amax && size<out){
                printf("%s %d %d\n", persons[j].name, persons[j].age, persons[j].worth);
                flag = 1;
                ++size;
            }
        if (!flag) cout<<"None"<<endl;
    }
}

A1056 Mice and Rice

#include <iostream>
#include <queue>

using namespace std;

struct{
    int w, r;
}mouse[1001];

int main(){
    int np, ng;
    cin>>np>>ng;
    queue<int> q;
    for (int i=0; i<np; i++)
        cin>>mouse[i].w;
    for (int i=0; i<np; i++){
        cin>>mouse[i].r;
        q.push(mouse[i].r);
    }
    int tmp = np;
    while(q.size() != 1){
        int group = tmp%ng==0?tmp/ng:tmp/ng+1;
        for (int i=0; i<group; i++){
            int max = q.front();
            for (int j=0; j<ng; j++){
                if (i*ng+j >= tmp) break;
                mouse[q.front()].r = group+1;
                if (mouse[q.front()].w > mouse[max].w)
                    max = q.front();
                q.pop();
            }
            q.push(max);
        }
        tmp = group;
    }
    mouse[q.front()].r = 1;
    for (int i=0; i<np; i++){
        cout<<mouse[i].r;
        if (i != np-1)
            cout<<" ";
    }
        
}

A1057 Stack

#include <iostream>
#include <stack>
#include <cstring>
#include <set>
using namespace std;

int mid = 0;
multiset<int> upper;
multiset<int, greater<int>> lower;

void adjust(int &mid){
    if (upper.size() > lower.size()){
        lower.insert(*upper.begin());
        upper.erase(upper.begin());
    }else if (upper.size()+1 < lower.size()){
        upper.insert(*lower.begin());
        lower.erase(lower.begin());
    }
    mid = *lower.begin();
}

int main(){
    int n;
    cin>>n;
    stack<int> s;
    for (int i=0; i<n; i++){
        char command[12];
        scanf("%s", command);
        if (command[1] == 'u'){
            int key;
            scanf("%d", &key);
            s.push(key);
            if (key > mid)
                upper.insert(key);
            else
                lower.insert(key);
            adjust(mid);
        }else if (command[1] == 'o'){
            if (!s.size()) 
                printf("Invalid\n"); 
            else{
                int key = s.top();
                printf("%d\n", s.top());
                s.pop();
                if (key > mid)
                    upper.erase(upper.find(key));
                else
                    lower.erase(lower.find(key));
                if (s.empty())
                    mid = 0;
                else
                    adjust(mid);
            }
        }else{
            if (!s.size()) 
                printf("Invalid\n"); 
            else
                printf("%d\n", mid);
        }
    }
}

A1058 A+B in Hogwarts

#include <iostream>

using namespace std;

typedef struct{
    int a, b, c;
}Node;

int main(){
    Node a, b;
    scanf("%d.%d.%d", &a.a, &a.b, &a.c);
    scanf("%d.%d.%d", &b.a, &b.b, &b.c);
    int i, j, k;
    i = a.a + b.a;
    j = a.b + b.b;
    k = a.c + b.c;
    if (k >= 29){
        ++j;
        k -= 29;
    }
    if (j >= 17){
        ++i;
        j -= 17;
    }
    printf("%d.%d.%d", i, j, k);
}

A1059 Prime Factors

#include <iostream>
#include <cmath>
#include <map>
#include <algorithm>

#define ll long long

using namespace std;

int isPrime[100010]{};
int main(){
    ll n, m;
    cin>>n;
    if (n == 1){
        cout<<"1=1";
        return 0;
    }
    m = n;
    fill(isPrime+2, isPrime+100010, 1);
    for (int i=2; i<50001; i++){
        for (int j=i*2; j<100001; j+=i){
            isPrime[j] = 0;
        }
    }
    map<ll, int> v;
    for (int i=2;;i++){
        if (isPrime[i] && n%i == 0){
            while(n%i == 0){
                v[i]++;
                n /= i;
            }
            if (n == 1) break;
        }
    }
    cout<<m<<"=";
    int flag = 0;
    for (auto &k: v){
        if (flag) cout<<"*";
        else flag = 1;
        cout<<k.first;
        if (k.second > 1)
            cout<<"^"<<k.second;
    }
    cout<<endl;
}

A1060 Are They Equal

#include <iostream>

using namespace std;

int main(){
    int n, na, nb, za = 0, zb = 0;
    string a, b;
    cin>>n>>a>>b;
    na = a.find('.')>= a.length()?a.length():a.find('.');
    nb = b.find('.')>= b.length()?b.length():b.find('.');
    while (za < a.length()){
        if (a[za] == '0' || a[za] == '.')
            za++;
        else
            break;
    }
    while (zb < b.length()){
        if (b[zb] == '0' || b[zb] == '.')
            zb++;
        else
            break;
    }
    if (za == a.length())
        na = 0;
    else if (a.find('.')<a.length() && a.find('.') < za)
        na = na+1-za;
    else
        na = na-za;
    if (zb == b.length())
        nb = 0;
    else if (b.find('.')<b.length() && b.find('.') < zb)
        nb = nb+1-zb;
    else
        nb = nb-zb;
    string ta = "", tb = "";
    for (int i=za; i<a.length(); i++){
        if (a[i] != '.')
            ta += a[i];
        if (ta.length()==n) 
            break;
    }
    for (int i=zb; i<b.length(); i++){
        if (b[i] != '.')
            tb += b[i];
        if (tb.length()==n) 
            break;
    }
    while(ta.length() < n)
        ta += "0";
    while(tb.length() < n)
        tb += "0";
    if (na != nb || ta != tb){
        cout<<"NO";
        printf(" 0.%s*10^%d 0.%s*10^%d", ta.c_str(), na, tb.c_str(), nb);
    }else{
        cout<<"YES";
        printf(" 0.%s*10^%d", ta.c_str(), na);
    }
}

2021 Recycling of Shared Bicycles

#include <iostream>
#include <cstdlib>
#include <algorithm>

using namespace std;

int spot[201][201]{}, vis[201]{}, map[201][201]; 
int main(){
    int n, m;
    cin>>n>>m;
    for (int i=0; i<m; i++){
        int a, b, dis;
        cin>>a>>b>>dis;
        spot[a][b] = dis;
        spot[b][a] = dis;
    }
    fill(map[0], map[0]+201*201, 10000);
    for (int i=0; i<=n; i++){
        fill(vis, vis+n+1, 0);
        map[i][i] = 0;
        while (true){
            int min = -1, mindis = 10000;
            for (int j=0; j<=n; j++){
                if (map[i][j] < mindis && !vis[j]){
                    min = j;
                    mindis = map[i][j];
                }
            }
            if (min == -1) break;
            vis[min] = 1;
            for (int j=0; j<=n; j++){
                if (spot[min][j])
                    if (map[i][min]+spot[min][j] < map[i][j] && !vis[j])
                        map[i][j] = map[i][min] + spot[min][j];
            }
        }
    }
    fill(vis, vis+n+1, 0);
    int visits = 0, tmp = 0, total = 0;
    while(visits <= n){
        int min = -1, mindis = 10000;
        for (int i=0; i<=n; i++){
            if (map[tmp][i] < mindis && !vis[i]){
                min = i;
                mindis = map[tmp][i];
            }
        }
        if (min == -1) break;
        total += map[tmp][min];
        tmp = min;
        visits++;
        vis[min] = 1;
        if (min == 0) cout<<0;
        else cout<<" "<<min;
    }
    cout<<endl;
    if (visits < n){
        int flag = 0;
        for (int i=1; i<=n; i++)
            if (!vis[i]) {
                if (flag) cout<<" ";
                else flag = 1;
                cout<<i;
            }
    }else
        cout<<total;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值