题目简单,但解题的思路需要转换一下,按常规思路肯定超时,推荐~

题意:给出n个人的姓名、年龄和拥有的钱,然后进行k次查询,输出年龄在[amin,amx]内的前m个最富有的人的信息。
如果财富值相同就就先输出年龄小的,如果年龄相同就按照名字的字典序排序输出~

n范围为10^5,所以显然不能每次查询的时候for一遍所有人,把符合条件的选出来再排序输出,这样肯定会超时。

但是注意到年龄的范围只有200,而且最后查询也跟年龄区间有关,那么有什么办法每次查询我只要取在这个年龄段里的人就好。
这样就想到用vector数组,vector node[i]存储所有年龄为i的人,且已经从大到小排好序。
那么对于要找[amin,amax]之间的前m个人,只要每次for一遍node[amin]~node[amax],比较每个node[i]的第一个,找出最大的输出,循环m次即可。
时间复杂度为k*m*[amax-amin],即O(1000*100*200)

#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=;
struct Node{
char name[];
int age;
int worth;
};
bool cmp(Node a,Node b){
if(a.worth==b.worth){
if(a.age==b.age){
if(strcmp(a.name,b.name)<=)
return true;
else
return false;
}
else
return a.age<b.age;
}
else
return a.worth>b.worth;
};
vector<Node> node[maxn]; //索引为年龄,node[i]存储年龄为i的人
int main()
{
int n,k;
scanf("%d %d",&n,&k);
Node p;
for(int i=;i<n;i++){
scanf("%s %d %d",p.name,&p.age,&p.worth);
node[p.age].push_back(p);
}
for(int i=;i<maxn;i++){
sort(node[i].begin(),node[i].end(),cmp);
}
int m,amin,amax;
int idx[maxn]; //记录每个node[i]参与比较的第一个位置
int num;
for(int i=;i<k;i++){
scanf("%d %d %d",&m,&amin,&amax);
Node maxNode;
maxNode.worth=-;
num=;//统计有没有人,没有的话输出None
int maxid;
memset(idx,,sizeof(idx));
printf("Case #%d:\n",i+);
//因为要找出前m个,所以for循环m次,每次找出当前最大的一个
for(int j=;j<=m;j++){
maxNode.worth=-;
maxid=-;
//在年龄范围内找出最大的,由于已经从大到小排好序,所以每次只要比较每个vector的第一个即可,其中最大的便肯定是范围内最大的
for(int g=amin;g<=amax;g++){
if(idx[g]<node[g].size()){
if(cmp(node[g][idx[g]],maxNode)){
maxNode.age=node[g][idx[g]].age;
maxNode.worth=node[g][idx[g]].worth;
strcpy(maxNode.name,node[g][idx[g]].name);
maxid=g;
}
}
}
if(maxid==-)
break;
num++;
printf("%s %d %d\n",node[maxid][idx[maxid]].name,node[maxid][idx[maxid]].age,node[maxid][idx[maxid]].worth);
idx[maxid]++; //找到最大的输出了,所以索引要++,下一次就比较该vector的下一个元素了。
}
if(num==)
printf("None\n");
}
return ;
}

PAT甲题题解-1055. The World's Richest (25)-终于遇见一个排序的不水题的更多相关文章

  1. PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)

    Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...

  2. PAT 甲级 1055 The World's Richest (25 分)(简单题,要用printf和scanf,否则超时,string 的输入输出要注意)

    1055 The World's Richest (25 分)   Forbes magazine publishes every year its list of billionaires base ...

  3. PAT甲题题解-1064. Complete Binary Search Tree (30)-中序和层次遍历,水

    由于是满二叉树,用数组既可以表示父节点是i,则左孩子是2*i,右孩子是2*i+1另外根据二分搜索树的性质,中序遍历恰好是从小到大排序因此先中序遍历填充节点对应的值,然后再层次遍历输出即可. 又是一道遍 ...

  4. PAT甲题题解-1002. A+B for Polynomials (25)-多项式相加

    注意两点:1.系数也有可能加起来为负!!!一开始我if里面判断为>0导致有样例没过...2.如果最后所有指数的系数都为0,输出一个0即可,原本以为是输出 1 0 0.0... #include ...

  5. PAT甲题题解-1039. Course List for Student (25)-建立映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789157.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  6. PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法

    贪心算法 次数最少的方法,即:1.每次都将0与应该放置在0位置的数字交换即可.2.如果0处在自己位置上,那么随便与一个不处在自己位置上的数交换,重复上一步即可.拿样例举例:   0 1 2 3 4 5 ...

  7. PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)

    题目就是给两个序列,第一个是排序前的,第二个是排序中的,判断它是采用插入排序还是堆排序,并且输出下一次操作后的序列. 插入排序的特点就是,前面是从小到大排列的,后面就与原序列相同. 堆排序的特点就是, ...

  8. PAT甲题题解-1102. Invert a Binary Tree (25)-(建树,水题)

    就是把输入给的左孩子右孩子互换一下,然后输出层次遍历和中序遍历. #include <iostream> #include <algorithm> #include <c ...

  9. PAT (Advanced Level) 1055. The World's Richest (25)

    排序.随便加点优化就能过. #include<iostream> #include<cstring> #include<cmath> #include<alg ...

随机推荐

  1. github团队使用记录

    Last login: Sat Nov 4 09:20:15 on ttys000 bogon:~ neveszhang$ git clone git@github.com:031502243/Cla ...

  2. BZOJ 1345 序列问题 单调栈

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1345 题目大意: 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce( ...

  3. MongoDB3.2配置文件.md

    Core Options systemLog Options systemLog: verbosity: <int> quiet: <boolean> traceAllExce ...

  4. es5与es6继承思考

    es5与es6继承思考 es6继承 class Father{ constructor(name){ this.name = name; } getName(){ console.log(this.n ...

  5. css里颜色的那些事儿(合法颜色值)

    css中主要有六种方法指定颜色: 1.十六进制颜色 2.RGB颜色 3.RGBA颜色 4.HSL色彩 5.HSLA颜色 6.预定义/跨浏览器的颜色名称 前三种是我们最常见的,也是用的最多的,而后三种对 ...

  6. CentOS7+ anaconda3 + Python-3.6 + tensorflow-cpu-1.5安装和配置

    CentOS7+ anaconda3 + Python-3.6 + tensorflow-cpu-1.5安装和配置 ========================================== ...

  7. linux echo设置颜色

    echo要变换颜色的时候,要使用参数-e 格式: echo -e "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo -e "\033[41;36 ...

  8. odoo销售转生产

    <!--form view 一个form视图足以--><record id="view_sale_tomrp_form" model="ir.ui.vi ...

  9. Python3入门(一)——概述与环境安装

    一.概述 1.python是什么 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和 ...

  10. Android提权原理

    Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿. 你想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输入 ...