ICode9

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

PAT甲级1056 Mice and Rice

2021-03-06 17:31:01  阅读:267  来源: 互联网

标签:老鼠 PAT 1056 int id ori Mice mouse mice


原题链接PAT甲级1056 Mice and Rice

这道题,2020年7月份做的时候,做了好久才AC,今天又做了一次。使用了比较直观的思路,模拟了一遍题目。A掉了

题意

给了n只老鼠,以及每只老鼠的体重,注意题目告诉了,每只老鼠的体重满足== ​​ distinct non-negative numbers==,即不同的非负数,也就是说每只老鼠的体重不同,而且,并没有说是整数,所以对于每只老鼠的体重,最好是按照double型存放。做pat要对数据描述字眼敏感,没有说是整数,最好存储为double。

将每k只老鼠分为一组,最后不足k只的话,剩余的老鼠组成一组。
关于分组,又给出了顺序。其实是一开始谁和谁靠着,比如原始数据里面,第三行是顺序,也就是说一开始6号、0号、8号是靠着的三只,故它们三个要决出一个体重最大的胜者,进入下一轮。7、10、5号是靠着的,故它们三个要决出一个体重最大的胜者,进入下一轮。
9、1、4三只是靠着的,故它们三个要决出一个体重最大的胜者,进入下一轮。此时只剩下了2、3号两只老鼠不足3只,故故它们两个要决出一个体重最大的胜者,进入下一轮。

11 3
25 18 0 46 37 3 19 22 57 56 10
6 0 8 7 10 5 9 1 4 2 3

思路

使用结构体来存放每只老鼠的数据

struct mice{
    int id;//老鼠的id
    double weight;//老鼠的体重,double类型
    int rcnt,r;//rcnt为当前老鼠的轮数,r为老鼠的排名
    mice():rcnt(0){}//将每只老鼠的轮数的初始值设为0

    friend bool operator < (const mice &a,const mice &b){//重载 < 运算符,使用priority_queue
        return a.weight < b.weight;
    }
}mouse[1010];//定义一个mice类型的数组,大小为1010

读入数据,将每只老鼠的id按照顺序赋值为 i 。使用vector < int > ori 记录原始顺序。
ori中存放了当前轮的老鼠id顺序,初始为给定的顺序。
使用while循环,定义一个新的vecotr < int > cur 用来存放进入下一轮比较的老鼠的id,不断遍历ori数组,定义了一个priority_queue < mice > q,将k只老鼠加入q中,这样自动获得当前k只老鼠中体重最大的老鼠,也就知道了这k只老鼠中体重最大的老鼠的id,让该只老鼠的rcnt加1,并且将当前老鼠的id加入到cur中,再之后让将cur赋值给ori,开始下一轮循环,直到ori中只有一只老鼠为止。
再之后将mouse数组根据rcnt排序,依次给每只老鼠赋排名。
再之后将mouse数组根据id从小到大排,之后输出每只老鼠的排名即可。

#include <bits/stdc++.h>

using namespace std;

struct mice{
    int id;
    double weight;
    int rcnt,r;
    mice():rcnt(0){}

    friend bool operator < (const mice &a,const mice &b){
        return a.weight < b.weight;
    }
}mouse[1010];

bool cmprcnt(mice &a,mice &b){
    return a.rcnt > b.rcnt;
}

bool cmpr(mice &a,mice &b){
    return a.id < b.id;
}

int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i = 0;i < n;i++) scanf("%lf",&mouse[i].weight);
    vector<int> ori;
    for(int i = 0;i < n;i++){
        int t;
        scanf("%d",&t);
        ori.push_back(t);
        mouse[i].id = i;
    }
    while(1){
        vector<int> cur;//定义在while里面,不然出问题
        for(int i = 0;i < ori.size(); ){//这里不要让i++
            int j = i;
            priority_queue<mice> q;//定义优先队列
            
            //找到k只老鼠,最后面不足k只,则到j==ori.size()结束,恰好满足条件
            //j要自增
            //注意是将id为ori[j]的老鼠加入到优先队列中
            //优先队列自动根据当前队列中的mice变量的体重进行调整,又快又自动
            while(j < ori.size() && j - i + 1 <= k) q.push(mouse[ori[j++]]);
            
            i = j;//令i = j
            mice temp = q.top();//取出当前组里面体重最大的老鼠
            int id = temp.id;//得到当前组老鼠中体重最大的老鼠的id
            mouse[id].rcnt++;//将该只老鼠的rcnt即轮数加1
            cur.push_back(id);//将该组胜者id加入到当前顺序数组cur中
        }
        if(cur.size() == 1) break;//如果cur中老鼠数量为1,即决出了最后的胜者,直接break
        ori = cur;//将ori赋为最新的一轮老鼠的id
    }

    sort(mouse,mouse + n,cmprcnt);//按照老鼠的轮数进行排名

    //给老鼠们赋排名
    int r = 1;
    for(int i = 0;i < n;i++){
        if(i && mouse[i].rcnt != mouse[i-1].rcnt) r = i + 1;
        mouse[i].r = r;
    }

    sort(mouse,mouse + n,cmpr);//按照老鼠的id从小到大进行排名

    for(int i = 0;i < n;i++){//输出每只老鼠对应的排名
        if(i) printf(" ");
        printf("%d",mouse[i].r);
    }

    return 0;
}

标签:老鼠,PAT,1056,int,id,ori,Mice,mouse,mice
来源: https://blog.csdn.net/weixin_44321570/article/details/114447062

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

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

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

ICode9版权所有