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

题意:给出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. 学习H5C3

    不一样的老师,不一样风格,刚开始我们都是非常热情,知道这是非常重要的,我需要坚持,加油!!!

  2. [A]1065 A+B and C (64bit)(挖坑待填)

    Given three integers A, B and C in [-2^63, 2^63], you are supposed to tell whether A+B > C. Input ...

  3. JSONP跨域和CORS跨域

    什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 同源策略 同源策略:域名.协议.端口均相同. 浏览器执行JavaScript脚本时,会检查这 ...

  4. zepto.js不支持scrollTop的解决办法

    zepto.js不支持animate({ scrollTop: 100},1000); 可以在移动端使用原生window.scrollTop(x,y);简便

  5. A - Zebras

    Oleg writes down the history of the days he lived. For each day he decides if it was good or bad. Ol ...

  6. ip、ifconfig命令与IP(转)

    Q:问题的要求就是在linux下不重新情况下,如何临时增加一个IP及临时删除一个IP ? A:该问题除了可以通过ifconfig命令完成外,也可以通过ip命令完成,不过两者是有区别的.ifconfig ...

  7. 如何判断Android设备是否为模拟器

    android.os.Build.BRAND:获取设备品牌 如果获取的Landroid/os/Build;->BRAND的值为 "generic"则为模拟器上运行. andr ...

  8. WPF后台线程更新UI

    0.讲点废话 最近在做一个文件搜索的小软件,当文件多时,界面会出现假死的状况,于是乎想到另外开一个后台线程,更新界面上的ListView,但是却出现我下面的问题. 1.后台线程问题 2年前写过一个软件 ...

  9. EZ 2018 03 30 NOIP2018 模拟赛(六)

    链接:http://211.140.156.254:2333/contest/67 转眼间上次加回来的Rating又掉完了. 这次不知为何特别水,T1想了一段时间没想出来弃了,导致后面心态炸了. T2 ...

  10. GBDT源码剖析

    如今,GBDT被广泛运用于互联网行业,他的原理与优点这里就不细说了,网上google一大把.但是,我自认为自己不是一个理论牛人,对GBDT的理论理解之后也做不到从理论举一反三得到更深入的结果.但是学习 ...