zoukankan      html  css  js  c++  java
  • PAT 天梯赛真题集

     题目:L2-010 排座位

    题意:

    1. x与y是敌对关系: a)也有共同好友:OK but...

                                 b)无共同朋友:No way

    2. x与y是朋友关系:No problem

    3. x与y既不是朋友也不敌对:OK

    朋友间并查集,用map记录敌对关系。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <bits/stdc++.h>
    #define scf3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define scf2(a,b) scanf("%d%d",&a,&b)
    using namespace std;
    int fa[110];
    int find(int x){return fa[x] == x ? x : fa[x] = find(fa[x]);}
    int main(){
        map< pair<int,int> ,bool>mp;
        int n, m, k;
        scf3(n,m,k);
        int x, y , op;
        for(int i = 1; i <= n; i++) fa[i] = i;
        for(int i = 1; i <= m; i++){
            scf3(x,y,op);
            if(op == 1){
                fa[find(x)] = find(y);
            }
            else if(op == -1){
                mp[make_pair(x,y)] = false;
                mp[make_pair(y,x)] = false;
            }
        }
        while(k--){
            scf2(x,y);
            if(find(x) == find(y)){
                if( !mp.count(make_pair(x,y)) || !mp.count(make_pair(y,x)) ) //不敌对
                    puts("No problem");
                else
                    puts("OK but...");
            }
            else{
                if( !mp.count(make_pair(x,y)) || !mp.count(make_pair(y,x)) ) //不敌对
                    puts("OK");
                else
                    puts("No way");
            }
        }
    }
    题目:L2-009 抢红包  用力戳我直达原题
    题意:模拟,sort.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <bits/stdc++.h>
    using namespace std;
    struct Node
    {
        int num;
        int get;
        double val;
    }node[10010];
    bool cmp(const Node &a,const Node &b){   //核心排序代码
        if(a.val == b.val)
        {
            if(a.get == b.get)
                return a.num < b.num;
            else
                return a.get > b.get;
        }
        else
            return a.val > b.val;
    }
    int main(){
        int n, m;
        memset(node,0,sizeof(node));
        scanf("%d",&n);
        for(int i = 1; i <= n; i++)  //初始化 下标等于编号
            node[i].num = i;
        for(int i = 1; i <= n; i++){
            scanf("%d",&m);
            int x;
            double y;
            while(m--){
                scanf("%d%lf", &x, &y);
                node[x].val += y;
                node[x].get ++;
                node[i].val -= y;
            }
        }
        sort(node + 1, node + n + 1, cmp);
        for(int i = 1; i <= n; i++){
            printf("%d %.2f ",node[i].num,node[i].val/100);
        }
    }
     
     
    题目:L2-008 最长对称子串  用力戳我直达原题
     
    题意:暴力,O(n2)
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        string s;
        getline(cin,s);
        int ans = -1;
        for(int i = 0; i < s.size(); i++){    //   aba型
            int sum = 1;
            int idx = i + 1;
            for(int j = i - 1; j >= 0; j--){
                if(s[idx] != s[j]) break;
                else sum += 2;
                idx++;
                if(idx >= s.size()) break;
            }
            ans = max(ans,sum);
        }
         
        for(int i = 0; i < s.size(); i++){   //aabb型
            if(s[i] != s[i+1]) continue;
            int sum = 2;
            int idx = i + 2;
            for(int j = i - 1; j >= 0; j--){
                if(s[idx] != s[j]) break;
                else sum += 2;
                idx++;
                if(idx >= s.size()) break;
            }
            ans = max(ans,sum);
        }
        cout << ans << endl;
    }

    题目:L2-016. 愿天下有情人都是失散多年的兄妹  

    用力戳我直达原题
     
    题意:就是....不能近亲结婚...也不能同性恋....
     
    用二叉树存双亲,DFS搜x的前四代人,存进set,再搜y的前四代人,看是否存在于set
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <bits/stdc++.h>
    using namespace std;
    set<int>st;
    bool flag;
    struct Node
    {
        int fa,mon;
        char sex;
    }node[100100];
    void dfs(int x,int num){
        if(num > 5)
            return;
        st.insert(x);
        if(node[x].fa != -1)  find(node[x].fa,num + 1);
        if(node[x].mon != -1) find(node[x].mon,num + 1);
    }
    void judge(int x,int num){
        if(num > 5)
            return;
        if(st.find(x) != st.end()){
            flag = false;
            return;
        }
        if(node[x].fa  != -1) judge(node[x].fa, num + 1);
        if(node[x].mon != -1) judge(node[x].mon,num + 1);
    }
     
    int main(){
        int n, id, fa, mon;
        char sex;
        memset(node,-1,sizeof(node));
        scanf("%d",&n);
        while(n--){
            scanf("%d %c %d %d",&id, &sex, &fa, &mon);
            node[id].fa = fa;
            node[id].mon = mon;
            node[id].sex = sex;
            node[fa].sex = 'M';    //父母也要设置性别啊...不然扣了8分orz
            node[mon].sex = 'F';
        }
     
        scanf("%d",&n);
        int x, y;
        while(n--){
            cin >> x >> y;
            if(node[x].sex == node[y].sex){
                puts("Never Mind");
                continue;
            }
            st.clear();
            flag = true;
            dfs(x,1);   //深搜将四代存进set
            judge(y,1); //深搜看四代是否与x重,用st.find()
            if(flag == trueputs("Yes");
            else             puts("No");
        }
    }

    题目:L2-015. 互评成绩 用力戳我直达原题

     

    题意:  模拟,sort,最后存stack。如此水题,去年决赛时竟没做满分,而且弄得很复杂.......

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <bits/stdc++.h>
    using namespace std;
    bool cmp(const int &a, const int &b){return a > b;}
    int main(){
        int n, k , m, x;
        double sco[10010];
        scanf("%d%d%d",&n, &k, &m);
        for(int i = 0; i < n; i++){
            int maxx = -1, minn = 110;
            for(int j = 0; j < k; j++){
                scanf("%d",&x);
                maxx = max(maxx, x);
                minn = min(minn, x);
                sco[i] += x;
            }
            sco[i] -= (maxx + minn); //去掉最高分和最低分
        }
        sort(sco, sco + n, cmp);
        stack<double>sta;
        for(int i = 0; i < m; i++){
            sta.push(sco[i] / (k - 2));
        }
        bool cnt = false;
        while(!sta.empty()){   //倒序输出
            if(cnt) printf(" "); cnt = true;
            printf("%.3f",sta.top());
            sta.pop();
        }
    }
    题目:L1-006 抢红包  用力戳我直达原题
    题意:求最长的  最小连续因子
    做法:三个for暴力枚举。注意len==1也要跑,因为例如 9 * 9,结果是1 3 ,而不是 1 9
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <bits/stdc++.h>
    #define scf0(a) scanf("%s",&a)
    #define scf1(a) scanf("%d",&a)
    #define scf2(a,b) scanf("%d%d",&a,&b)
    #define scf3(a,b,c) scanf("%d%d%d",&a,&b,&c)
    #define MEM(a,b) memset(a,b,sizeof(a))
    #define pii pair<int,int>
    #define pdd pair<double,double>
    #define LL long long
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const double eps = 1e-8;
    const int maxn = 10000 + 5;
    int main() {
        int n, len, i, j;
        scf1(n);
        bool flag = false;
        for(len = 12; len >= 1; len--) {   //长度从12往1搜
            for(i = 2; i <= (int)sqrt(n); i++) { //i代表连续因子的第一个数,因子最大只能是sqrt(n)
                LL sum = 1;
                for(j = i; j <= len+i-1; j++) {  //连续len个数相乘
                    sum *= j;
                }
                if(n % sum == 0) {
                    flag = true;
                    break;
                }
            }
            if(flag) break;
        }
        if(flag) {
            printf("%d ",len);
            bool cnt = false;
            for(int k = i; k <= len+i-1; k++) {
                if(cnt) printf("*"); cnt = true;
                printf("%d",k);
            }
            puts("");
        }
        else {
            printf("1 %d",n);
        }
    }
  • 相关阅读:
    Java实现 蓝桥杯 历届试题 网络寻路
    Joda-Time 简介
    Eclipse自动生成返回值对象的快捷键是什么?
    eclipse中使用Maven管理java工程设置jdk版本为jdk1.8
    Windows10系统下,彻底删除卸载MySQL
    win10 安装 mysql解压版安装步骤
    使用MySQL Workbench建立数据库,建立新的表,向表中添加数据
    ubuntu安装mysql可视化工具MySQL-workbench及简单操作
    MySQL Linux压缩版安装方法
    【Linux】MySQL解压版安装及允许远程访问
  • 原文地址:https://www.cnblogs.com/bestwzh/p/6476016.html
Copyright © 2011-2022 走看看