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

题意:给出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&#39;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&#39;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&#39;s Richest (25)

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

随机推荐

  1. lodash的运用

    Object 对象 1._.merge(object, [sources]) 此方法类似于_.assign,除了它递归地将源对象的自有和继承的可枚举字符串键控属性合并到目标对象中. 如果存在目标值,将 ...

  2. JAXB完毕XML与Java对象的互转

    这段时间都老忙了,甚至连周末全部人员都在赶产品的进度,想想连续上12天班,人都有点晕了! 到这会儿最终有点时间.所以准备和大家分享一下JAXB,会不会有人认为有点陌生呢?没事,这里跟大伙儿简单的描写叙 ...

  3. 金蝶KIS 13.0专业版破解方法破解安装流程 金蝶KIS 13.0专业版安装流程

    金蝶KIS 13.0安装 1.先安装操作系统Windows server 2008 R2. 2.再安装SQL2008 R2. 3.再安装金蝶KIS 13.0专业版. 在安装时记住须要将系列号设置成为1 ...

  4. 《ACM国际大学生程序设计竞赛题解Ⅰ》——模拟题

    这篇文章来介绍一些模拟题,即一类按照题目要求将现实的操作转换成程序语言. zoj1003: On every June 1st, the Children's Day, there will be a ...

  5. Servlet的学习之Request请求对象(2)

    在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...

  6. String、StringBuilder和StringBuffer

    1.string不可变性 java的docs有这样一句话:Strings are constant; their values cannot be changed after they are cre ...

  7. IntelliJ IDEA 导入eclipse项目包及附属包

    使用IntelliJ IDEA 工具导入eclipse项目包,并添加另外一个项目包为库文件 1.导入项目包1,如Demo1,File-->New--->Progect From Exist ...

  8. mybatis下的分页,支持所有的数据库

    大家都知道,mybatis的自带分页方法只是逻辑分 页,如果数据量很大,内存一定会溢出,不知道为什么开源组织不在里面集成hibernate的物理分页处理方法!在不修改mybatis源代码的情况下, 应 ...

  9. Angular之响应式表单 ( Reactive Forms )

    项目结构 一 首页 ( index.html ) <!doctype html> <html lang="en"> <head> <met ...

  10. ubuntu16.04安装python3,numpy,pandas等量化计算库

    ubunt安装python3 sudo add-apt-repository ppa:fkrull/deadsnakessudo apt-get updatesudo apt-get install ...