ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021.9PAT备考刷题笔记

2021-07-25 23:02:02  阅读:119  来源: 互联网

标签:PAT 2021.9 scanf ++ int vector ans include 刷题


1001 考察点 字符串的处理

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

int main(){
    int x, y;
    cin >> x >> y;
    string s = to_string(x+y);
    for(int i = 0; i < s.size(); i++){
        printf("%c", s[i]);
        if(s[i]=='-') continue;
        int t = s.size()-i-1;
        if(t%3==0 && t!=0) printf(",");
    }
    printf("\n");
}

1002 思路:开个一百的数组,记录每一项的系数。最后数下几个非零项,依次输出

#include<iostream>
#include<vector>
using namespace std;
const int M = 1000+3;

int main(){
    vector<double> v(M, 0);
    int K; 
    scanf("%d", &K);
    for(int i = 0; i < K; i++){
        int x; double y;
        scanf("%d %lf", &x, &y);
        v[x] += y;
    }
    int cnt = 0;
    scanf("%d", &K);
    for(int i = 0; i < K; i++){
        int x; double y;
        scanf("%d %lf", &x, &y);
        v[x] += y;
    }
    for(int i = M-1; i >= 0; i--)
        if(v[i]!=0) cnt++;
    printf("%d", cnt);
    for(int i = M-1; i >= 0; i--){
        if(v[i] !=0 ) printf(" %d %.1f", i, v[i]);
    }
    printf("\n");
}

 1003 Dij那什么求最短路的算法。要新建两个变量保存路径条数和最大重量,更新最短路的时候分为大于和等于两种情况。

#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;
int n, m, c1, c2;
vector<int> w;
vector<vector<int>> dis;
vector<int> visited;
vector<int> cnts;
vector<int> weights;
int main(){
    scanf("%d %d %d %d", &n, &m, &c1, &c2);
    for(int i = 0; i < n; i++){
        int x; scanf("%d", &x);
        w.push_back(x);
    }
    dis.resize(n, vector<int>(n, -1));
    for(int i = 0; i < m; i++){
        int x, y, d; scanf("%d %d %d", &x, &y, &d);
        dis[x][y] = dis[y][x] = d;
    }
    dis[c1][c1] = 0;
    visited.resize(n, 0);
    //visited[c1] = 1;
    cnts.resize(n, 0); cnts[c1] = 1;
    weights.resize(n, 0); weights[c1] = w[c1];
    for(int i = 0; i < n; i++){
        int M = INT_MAX;
        int t = -1;
        for(int j = 0; j < n; j++){
            if(visited[j]==0 && dis[c1][j]!=-1 && dis[c1][j]<M){
                M = dis[c1][j];
                t = j;
            }
        }
        visited[t] = 1;
        for(int j = 0; j < n; j++){
            if(visited[j]==0 && dis[t][j]!=-1){
                if(dis[c1][j]==-1 || dis[c1][j]>dis[c1][t]+dis[t][j]){
                    dis[c1][j] = dis[c1][t]+dis[t][j];
                    cnts[j] = cnts[t];
                    weights[j] = weights[t]+w[j];
                }
                else if(dis[c1][j]==dis[c1][t]+dis[t][j]){
                    cnts[j] += cnts[t];
                    weights[j] = max(weights[j], weights[t]+w[j]);
                }
            }
        }
    }
    printf("%d %d\n", cnts[c2], weights[c2]);
    //cout << cnts[c2] << " ;
}

1004 bfs

#include <iostream>
#include <vector>
#include<queue>
#include<unordered_map>
using namespace std;
const int MAX = 100+2;
int N, M;

int main(){
    scanf("%d %d", &N, &M);
    vector<vector<int>> tree(MAX);
    for(int i = 0; i < M; i++){
        int id, k;
        scanf("%d %d", &id, &k);
        for(int j = 0; j < k; j++){
            int x; scanf("%d", &x);
            tree[id].push_back(x);
        }
    }
    int root = 1;
    queue<int> q;
    vector<int> cnt(MAX, 0);
    unordered_map<int, int> deep; 
    deep[1] = 0; q.push(1);
    int D = 0;
    while(!q.empty()){
        int t = q.front(); q.pop();
        D = deep[t];
        if(tree[t].empty()) cnt[deep[t]]++;
        for(int i = 0; i < tree[t].size(); i++){
            int y = tree[t][i];
            deep[y] = deep[t]+1;
            q.push(y);
        }
    }
    bool first = true;
    for(int i = 0; i <= D; i++)
    {
        if(first) first = false; else printf(" ");
        printf("%d", cnt[i]);
    }
    printf("\n");
    
    
}

 1005 注意和直接为零的情况。WA了一个测试点。

#include<iostream>
#include<vector>
using namespace std;
vector<string> v = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int main(){
    string s;
    cin >> s;
    int n = 0;
    for(int i = 0; i < s.size(); i++){
        n += s[i]-'0';
    }
    if(n==0) {
        cout << "zero" << endl;
        return 0;
    }
    bool first = true;
    vector<string> ans;
    while(n>0){
        //
        ans.push_back(v[n%10]);
        n = n/10;
    }
    for(int i = ans.size()-1; i>=0; i--){
        if(first) first = false; else printf(" ");
        cout << ans[i];
    }
    
    printf("\n");
}

 1006 就按题目说的做

#include<iostream>
#include<vector>
using namespace std;
int m;

int main(){
    scanf("%d", &m);
    vector<string> ids;
    //vector<int> arrs, leas;
    int A = 1e8, B = 0;
    int x = -1, y = -1;
    for(int i = 0; i < m; i++){
        string s; cin >> s;
        ids.push_back(s);
        int x1, y1, z1, x2, y2, z2;
        scanf("%d:%d:%d %d:%d:%d", &x1, &y1, &z1, &x2, &y2, &z2);
        //arrs.push_back(x1*3600+y1*60+z1);
        //leas.push_back(x2*3600+y2*60+z2);
        int a = x1*3600+y1*60+z1, b = x2*3600+y2*60+z2;
        if(a<A) {A = a; x = i;}
        if(b>B) {B = b; y = i;}
    }
    cout << ids[x] << " " << ids[y] << endl;
    
}

 1007 滑动窗口 保持窗口内和大于零,看情况更新答案。注意全负数的情况,还要注意和为零算普通的答案。

#include<iostream>
#include<vector>
using namespace std;
int m;
vector<int> v;
int main(){
    scanf("%d", &m);
    for(int i = 0; i < m; i++){
        int x; scanf("%d", &x);
        v.push_back(x);
    }
    int l = 0, r = 0;
    int sum = 0;
    int L = -1, R = -1, ans = -1;
    while(r < m){
        sum += v[r];
        if(sum < 0) {
            l = r+1;
            sum = 0;
        }
        else if(sum > ans){
            ans = sum;
            L = l; R = r;
            //cout << l << " " << r << " " << sum << endl;
        }
        r++;
    }
    if(ans == -1) printf("%d %d %d\n", 0, v[0], v[m-1]);
    else printf("%d %d %d\n", ans, v[L], v[R]);
}

1008 题面意思

#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int> v;
int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        int x; scanf("%d", &x);
        v.push_back(x);
    }
    int ans = 0;
    for(int i = 0; i < n; i++){
        if(i==0) ans += v[i]*6;
        else {
            if(v[i] > v[i-1]) 
                ans += (v[i]-v[i-1])*6;
            else 
                ans += (v[i-1]-v[i])*4;
        }
        ans += 5;
    }
    printf("%d\n", ans);
    
}

1009 和上面那个多项式题目类似。哇照这个进度我一天能不能A十道啊。

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
const int M = 2000+5;
int k;

int main(){
    unordered_map<int, double> T1, T2;
    scanf("%d", &k);
    for(int i = 0; i < k; i++){
        int x; double y; 
        scanf("%d %lf", &x, &y);
        T1[x] = y;
    }
    scanf("%d", &k);
    for(int i = 0; i < k; i++){
        int x; double y;
        scanf("%d %lf", &x, &y);
        T2[x] = y;
    }
    vector<double> cos(M, 0);
    for(const auto& a:T1){
        for(const auto& b:T2){
            cos[a.first+b.first] += a.second*b.second;
        }
    }
    int cnt = 0;
    for(int i = 0; i < M; i++)
        if(cos[i]!=0) cnt++;
    printf("%d", cnt);
    for(int i = M-1; i >= 0; i--){
        if(cos[i]!=0) printf(" %d %.1f", i, cos[i]);
    }
    printf("\n");
}

1010 救命 WA了两次呜呜呜还没写出来待我看看。错误点1:进制选择没有上限,我自以为地设置为36。看了一圈题解要二分还要处理溢出orz明天再弄吧。但是为了一天A10题我决定苟个下一题。

1011

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

int main(){
    double x;
    double ans = 1;
    vector<char> v = {'W', 'T', 'L'};
    for(int i = 0; i < 3; i++){
        x = 0; char t;
        for(int j = 0; j < 3; j++){
            double c; scanf("%lf", &c);
            if(c > x) t = v[j];
            x = max(x, c);
        }
        printf("%c ", t);
        ans *= x;
    }
    ans = (ans*0.65-1)*2;
    printf("%.2f\n", ans);
}

标签:PAT,2021.9,scanf,++,int,vector,ans,include,刷题
来源: https://blog.csdn.net/qq_41922663/article/details/119087516

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有