PAT甲级刷题记录(1081-1090)

1081-1090

1081 Rational Sum(20)

#include<cstdio>
#include<cmath>
using namespace std;
int gcd(int a, int b){
//     return b > 0 ? gcd(b, a % b) : a;
    return b == 0 ? abs(a) : gcd(b, a % b); 
}
int main(){
    int n, a, b, suma = 0, sumb = 1;
    scanf("%d",&n);
    for(int i = 0; i < n ;i++){
        scanf("%d/%d", &a, &b);
        int temp = gcd(a, b);
        a /= temp;
        b /= temp;
        suma = a * sumb + b * suma;
        sumb = sumb * b;
        temp = gcd(suma, sumb);
        suma /= temp;
        sumb /= temp;
    }
    int ans = suma / sumb;
    suma = suma - (sumb * ans);
    if(ans != 0){
        printf("%d", ans);
        if(suma != 0 ){
            printf(" ");
        }
    }
    if(suma != 0){
        printf("%d/%d", suma, sumb);
    }
    if(ans == 0 && suma == 0){
        printf("0");
    }
    return 0;
}

1082 Read Number in Chinese(25)

//from liuchuo
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string num[10] = { "ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
string c[6] = { "Ge","Shi", "Bai", "Qian", "Yi", "Wan" };
int J[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
vector<string> res;
int main() {
    int n;
    cin >> n;
    if (n == 0) {
        cout << "ling";
        return 0;
    }
    if (n < 0) {
        cout << "Fu ";
        n = -n;
    }
    int part[3];
    part[0]= n / 100000000; 
    part[1]= (n % 100000000) / 10000;
    part[2] = n % 10000;
    bool zero = false; //是否在非零数字前输出合适的ling
    int printCnt = 0; //用于维护单词前没有空格,之后输入的单词都在前面加一个空格。
    for (int i = 0; i < 3; i++) {
        int temp = part[i]; //三个部分,每部分内部的命名规则都一样,都是X千X百X十X
        for (int j = 3; j >= 0; j--) {
            int curPos = 8 - i * 4 + j; //当前数字的位置
            if (curPos >= 9) continue; //最多九位数
            int cur = (temp / J[j]) % 10;//取出当前数字
            if (cur != 0) {
                if (zero) {
                    printCnt++ == 0 ? cout<<"ling" : cout<<" ling";
                    zero = false;
                }
                if (j == 0)
                    printCnt++ == 0 ? cout << num[cur] : cout << ' ' << num[cur]; //在个位,直接输出
                else                             
                    printCnt++ == 0 ? cout << num[cur] << ' ' << c[j] : cout << ' ' << num[cur] << ' ' << c[j]; //在其他位,还要输出十百千
            } else {
                if (!zero&&j != 0 && n / J[curPos] >= 10) zero = true;   //注意100020这样的情况
            }
        }
        if (i != 2 && part[i]>0) cout << ' ' << c[i + 4]; //处理完每部分之后,最后输出单位,Yi/Wan
    }
    return 0;
}

1083 List Grades(25)

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 1;
struct student{
    string name, id;
    int grade;
}stu[maxn];
bool cmp(student s1, student s2){
    return s1.grade > s2.grade;
}
int main(){
    int n;
    int grade1, grade2;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> stu[i].name >> stu[i].id >> stu[i].grade;
    }
    cin >> grade1 >> grade2;
    sort(stu, stu + n, cmp);
    int flag = 0;
    for(int i = 0; i < n; i++){
        if(stu[i].grade >= grade1 && stu[i].grade <= grade2){
            cout << stu[i].name << " " << stu[i].id << endl;
            flag = 1;
        }
    }
    
    if(flag == 0){
        cout << "NONE";
    }
}

1084 Broken Keyboard(20)

#include<iostream>
#include<string>
using namespace std;
int main(){
    string s1, s2, ans;
    getline(cin, s1);
    getline(cin, s2);
    for(auto ch: s1){
        if(s2.find(ch) == string::npos &&
           ans.find(toupper(ch)) == string::npos){
            ans += toupper(ch);
        }
    }
    cout << ans;
}

1085 Perfect Sequence(25)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 1;
vector<int> v;
int main(){
    long long p;//测试点5爆int了
    int n;
    cin >> n >> p;
    v.resize(n);
    for(int i = 0; i < n; i++){
        cin >> v[i];
    }
    sort(v.begin(), v.end());
    int len = 1;
    for(int i = 0; i < n; i++){
        while(i + len < n && v[i] * p >= v[i + len]){
            len++;
        }
    }
    cout << len;
    
}

1086 Tree Traversals Again(25)

#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode{
    int val;
    TreeNode *left, *right;
    TreeNode(int _val){
        val = _val;
        left = right = NULL;
    }
};
int n;
vector<int> preorder, inorder;
stack<int> s;
int space_flag = 0;

TreeNode *buildTree(int preBegin,int preEnd,vector<int>& inorder,int inBegin, int inEnd){
    if(preBegin > preEnd || inBegin > inEnd)
        return nullptr;
    TreeNode* root = new TreeNode(preorder[preBegin]);
    int index=inBegin,leftPreEnd=0;
    for(;index<=inEnd&&preorder[preBegin]!=inorder[index]; ++index) ++leftPreEnd;

    root->left  = buildTree(preBegin+1,preBegin+leftPreEnd,inorder,inBegin,index-1);
    root->right = buildTree(preBegin+1+leftPreEnd,preEnd,inorder,index+1,inEnd);
    return root;
}
void postorder(TreeNode* root){
    if(root -> left){
        postorder(root -> left);
    }
    if(root -> right){
        postorder(root -> right);
    }
    if(space_flag == 0){
        cout << root -> val;
        space_flag = 1;
    }else{
        cout << " ";
        cout << root -> val;
    }
    
}
int main(){
    cin >> n;
    string opt;
    int optnum;
    for(int i = 1; i <= 2 * n; i++){
        cin >> opt;
        if(opt == "Push"){
            cin >> optnum;
            preorder.push_back(optnum);
            s.push(optnum);
        }else{
            optnum = s.top();
            inorder.push_back(optnum);
            s.pop();
        }
    }
    TreeNode* root = buildTree(0, preorder.size()-1, inorder,0,inorder.size()-1);
    postorder(root);
}

1087 All Roads Lead to Rome(30)

#include<iostream>
#include<map>
#include<vector>
using namespace std;
const int maxn = 201;
const int INF = 1e8;
int weight[maxn], adj[maxn][maxn],dis[maxn];
bool visit[maxn] = {false};
map<string, int> m;
map<int, string> m2;
vector<int> pre[maxn], temppath, path;

int maxvalue = 0, cntpath = 0;
double maxavg = 0;

void dfs(int v){
    temppath.push_back(v);
    if(v == 0){
        int value = 0;
        for(int i = 0; i < temppath.size(); i++){
            value += weight[temppath[i]];
        }
        double tempavg = 1.0 * value / (temppath.size() - 1);
        if(value > maxvalue){
            maxvalue = value;
            path = temppath;
            maxavg = tempavg;
        }else if(value == maxvalue && tempavg > maxavg){
            maxavg = tempavg;
            path = temppath;
        }
        temppath.pop_back();
        cntpath++;
        return;
    }
    
    for(int i = 0; i < pre[v].size(); i++){
        dfs(pre[v][i]);
    }
    temppath.pop_back();
}

int main(){
    fill(dis, dis + maxn, INF);
    fill(weight, weight + maxn, 0);
    fill(adj[0], adj[0] + maxn * maxn, INF);
    fill(visit, visit + maxn, false);
    int n, k;
    string start;
    cin >> n >> k >> start;
    m[start] = 0;
    m2[0] = start;
    for(int i = 1; i <= n - 1; i++){
        string temp_city;
        int temp_happiness;
        cin >> temp_city >> temp_happiness;
        m[temp_city] = i;
        m2[i] = temp_city;
        weight[i] = temp_happiness;
    }
    
    for(int i = 1; i <= k; i++){
        string city1, city2;
        int val;
        cin >> city1 >> city2 >> val;
        adj[m[city1]][m[city2]] = val;
        adj[m[city2]][m[city1]] = val;
    }
    
    dis[0] = 0;
    
    for(int i = 0; i <= n - 1; i++){
        int u = -1, minn = INF;
        for(int j = 0; j <= n - 1; j++){
            if(!visit[j] && dis[j] < minn){
                u = j;
                minn = dis[j];
            }
        }
        if(u == -1){
            break;
        }
        visit[u] = true;
        for(int v = 0; v <= n - 1; v++){
            if(!visit[v] && adj[u][v] != INF){
                if(dis[u] + adj[u][v] < dis[v]){
                    dis[v] = dis[u] + adj[u][v];
                    pre[v].clear();
                    pre[v].push_back(u);
                }else if(dis[u] + adj[u][v] == dis[v]){
                    pre[v].push_back(u);
                }
            }
        }
    }
    int rom = m["ROM"];
    dfs(rom);
    
    printf("%d %d %d %d\n", cntpath, dis[rom], maxvalue, (int)maxavg);
    
    for(int i = path.size() - 1; i >= 1; i--){
        cout << m2[path[i]] << "->";
    }
    cout << "ROM";
    return 0;
}

1088 Rational Arithmetic(20)

//写不动 直接抄了
#include<cstdio>
#include<cmath>
//int 不够
#define ll long long
using namespace std;
ll gcd(ll a, ll b){
    return b == 0 ? a : gcd(b, a % b);
}
void func(ll m, ll n){
    if(m * n == 0){
        printf("%s", n == 0 ? "Inf" : "0");
        return;
    }
    bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0));
    m = abs(m);
    n = abs(n);
    ll x = m / n;
    printf("%s", flag ? "(-":"");
    if(x != 0) printf("%lld", x);
    if(m % n == 0){
        if(flag) printf(")");
        return;
    }
    if(x != 0) printf(" ");
    m = m - x * n;
    ll t = gcd(m, n);
    m = m / t;
    n = n / t;
    printf("%lld/%lld%s", m, n, flag ? ")":"");
}
int main(){
    ll a, b, c, d;
    scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
    func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n");
    func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
    func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
    func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
    return 0;
    
}

1089 Insert or Merge(25)

#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v1, v2;
int n;

bool judge(){
    for(int i = 0; i < n; i++){
        if(v1[i] != v2[i]){
            return false;
        }
    }
    return true;
}
void insert_once(vector<int> &v){
    vector<int> temp;
    int pos = -1;
    auto right = v.begin();
    for(int i = 0; i < v.size() - 1; i++){
        right++;
        if(v[i] > v[i + 1]){
            pos = i;
            break;
        }
    }
    if(pos == -1){
        return;
    }
    sort(v.begin(), ++right);
//  非sort实现插入排序
//     int newpos = -1;
//     for(int i = 0; i <= pos; i++){
//         if(v[i] < v[pos + 1]){
//             temp.push_back(v[i]);
//         }else{
//             temp.push_back(v[pos + 1]);
//             newpos = i;
//             break;
//         }
//     }
//     for(int i = newpos; i <= pos; i++){
//         temp.push_back(v[i]);
//     }
//     for(int i = pos + 2; i < v.size(); i++){
//         temp.push_back(v[i]);
//     }
//     v= temp;
}

void merge_once(vector<int> &v){
    int len = 1;
    bool flag = true;
    while(flag){
        len *= 2;
        for(int i = 0; i < v.size(); i+=len){
            for(int j = i; j < min(i + len - 1, int(v.size() - 1));j++){
                if(v[j] > v[j + 1]){
                    flag = false;
                    break;
                }
            }
        }
    }
    vector<int>::iterator left,right;
    left = right = v.begin();
    if(len > v.size()){
        sort(v.begin(), v.end());
        return;
    }
    for(int i = 0; i < v.size() / len; i++){
        for(int j = 0; j < len; j++){
            if(i != 0){
                left++;
            }
            right++;
        }
        sort(left, right);
    }
    
    sort(right, v.end());
    
//     for(int i = 0; i < v.size() ; i+=len){
//         sort(left, right);
//         if(i + len + len > v.size()){
//             right = v.end();
//             for(int j = 0; j < len; j++){
//                 left++;
//             }
//         }else{
//             for(int j = 0; j < len; j++){
//                 left++;
//                 right++;
//             }
//         }
//     }
    
}

bool insert_sort(){
    for(int i = 0; i < n; i++){
        if(judge()){
            return true;
        }
        insert_once(v1);
    }
    return false;
}


int main(){
    cin >> n;
    v1.resize(n);
    v2.resize(n);
    for(int i = 0; i < n; i++){
        cin >> v1[i];
    }
    for(int i = 0; i < n; i++){
        cin >> v2[i];
    }
    if(insert_sort()){
        insert_once(v2);
        cout << "Insertion Sort\n";
        for(int i = 0; i < n; i++){
            if(i != 0){
                cout << " ";
            }
            cout << v2[i];
        }
        return 0 ;
    }else{
        merge_once(v2);
        cout << "Merge Sort\n";
        for(int i = 0; i < n; i++){
            if(i != 0){
                cout << " ";
            }
            cout << v2[i];
        }
        return 0;
    }
}

1090 Highest Price in Supply Chain(25)

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 1;
int maxnum, maxdepth;
vector<int> v[maxn];
void dfs(int index, int depth){
    if(v[index].size() == 0){
        if(maxdepth == depth){
            maxnum++;
        }
        if(maxdepth < depth){
            maxdepth = depth;
            maxnum = 1;
        }
        return;
    }
    for(int i = 0; i < v[index].size(); i++){
        dfs(v[index][i], depth + 1);
    }
}
int main(){
    int n;
    double p, r;
    cin >> n >> p >> r;
    int root, temp;
    for(int i = 0; i < n; i++){
        cin >> temp;
        if(temp == -1){
            root = i;
        }else{
            v[temp].push_back(i);
        }
    }
    dfs(root, 0);
    printf("%.2f %d", p * pow(1 + r / 100, maxdepth), maxnum);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值