1055 The World's Richest(25 分)

Forbes magazine publishes every year its list of billionaires based on the annual ranking of the world's wealthiest people. Now you are supposed to simulate this job, but concentrate only on the people in a certain range of ages. That is, given the net worths of N people, you must find the M richest people in a given range of their ages.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 positive integers: N (≤10​5​​) - the total number of people, and K (≤10​3​​) - the number of queries. Then N lines follow, each contains the name (string of no more than 8 characters without space), age (integer in (0, 200]), and the net worth (integer in [−10​6​​,10​6​​]) of a person. Finally there are K lines of queries, each contains three positive integers: M (≤100) - the maximum number of outputs, and [AminAmax] which are the range of ages. All the numbers in a line are separated by a space.

Output Specification:

For each query, first print in a line Case #X: where X is the query number starting from 1. Then output the Mrichest people with their ages in the range [AminAmax]. Each person's information occupies a line, in the format

Name Age Net_Worth

The outputs must be in non-increasing order of the net worths. In case there are equal worths, it must be in non-decreasing order of the ages. If both worths and ages are the same, then the output must be in non-decreasing alphabetical order of the names. It is guaranteed that there is no two persons share all the same of the three pieces of information. In case no one is found, output None.

Sample Input:

12 4
Zoe_Bill 35 2333
Bob_Volk 24 5888
Anny_Cin 95 999999
Williams 30 -22
Cindy 76 76000
Alice 18 88888
Joe_Mike 32 3222
Michael 5 300000
Rosemary 40 5888
Dobby 24 5888
Billy 24 5888
Nobody 5 0
4 15 45
4 30 35
4 5 95
1 45 50

Sample Output:

Case #1:
Alice 18 88888
Billy 24 5888
Bob_Volk 24 5888
Dobby 24 5888
Case #2:
Joe_Mike 32 3222
Zoe_Bill 35 2333
Williams 30 -22
Case #3:
Anny_Cin 95 999999
Michael 5 300000
Alice 18 88888
Cindy 76 76000
Case #4:
None

题目大意:给出名字,年龄,财富,并且输入几个以年龄为区间的查询,输出这个年龄段内的规定人数,并且需要按财富非递增排,财富相同按年龄非递减排,年龄相同,那么根据名字字典序有效到大排。

//这是我第一次提交的代码,将其选出来重新排序的粗暴方法,第2个测试点没有过,显示超时,得了22分。

#include <stdio.h>
#include<algorithm>
#include <iostream>
#include<vector>
#include<string.h>
using namespace std;
struct Stu{
char name[];
int age,worth;
}stu[]; bool cmp(Stu &a,Stu &b){
if(a.worth>b.worth)return true;
else if(a.worth==b.worth&&a.age<b.age)
return true;
else if(a.worth==b.worth&&a.age==b.age&&strcmp(a.name,b.name)<)
return true;
return false;
}
bool cmp2(Stu &a,Stu &b){
if(a.age<b.age)return true;
else if(a.age==b.age&&a.worth>b.worth)return true;
else if(a.age==b.age&&a.worth==b.worth&&strcmp(a.name,b.name)<)return true;
return false;
}
int main(){
int n,k;
scanf("%d %d",&n,&k);
for(int i=;i<n;i++){
scanf("%s %d %d",stu[i].name,&stu[i].age,&stu[i].worth);
}
sort(stu,stu+n,cmp2);//一开始应该先按年龄排序~
int no,from,to;
for(int i=;i<k;i++){
vector<Stu> sv;
scanf("%d %d %d",&no,&from,&to);//需要用树状数组吗?
for(int ii=;ii<n;ii++){
if(stu[ii].age>=from&&stu[ii].age<=to)
sv.push_back(stu[ii]);
// if(sv.size()==no)break;
}
printf("Case #%d:\n",i+);
if(sv.size()==)printf("None\n");
else{
sort(sv.begin(),sv.end(),cmp);
for(int j=;j<no&&j<sv.size();j++)
printf("%s %d %d\n",sv[j].name,sv[j].age,sv[j].worth);
}
} return ;
}

代码来自:https://www.liuchuo.net/archives/2255

#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
struct node {
char name[];
int age, money;
};
int cmp1(node a, node b) {
if(a.money != b.money)
return a.money > b.money;//首先根据财富排序
else if(a.age != b.age)
return a.age < b.age;//再根据年龄排序,
else
return (strcmp(a.name, b.name) < );//再根据姓名排序
} int main() {
int n, k, num, amin, amax;
scanf("%d %d", &n, &k);
vector<node> vt(n), v;
vector<int> book(, );
for(int i = ; i < n; i++)
scanf("%s %d %d", vt[i].name, &vt[i].age, &vt[i].money);
sort(vt.begin(), vt.end(), cmp1);
for(int i = ; i < n; i++) {
if(book[vt[i].age] < ) {//根据年龄来。
v.push_back(vt[i]);//就算这个年龄的人多余100,那么也不会输出,M最大为100.
book[vt[i].age]++;//将其整理到一个新的数组里,按照这个进行查询输出。
}
}
for(int i = ; i < k; i++) {
scanf("%d %d %d", &num, &amin, &amax);
vector<node> t;
for(int j = ; j < v.size(); j++) {
if(v[j].age >= amin && v[j].age <= amax)
t.push_back(v[j]);
}
if(i != ) printf("\n");
printf("Case #%d:", i + );
int flag = ;
for(int j = ; j < num && j < t.size(); j++) {
printf("\n%s %d %d", t[j].name, t[j].age, t[j].money);
flag = ;
}
if(flag == ) printf("\nNone");
}
return ;
}

//本题的考点主要就是如何不超时。

1.利用了题目中的信息 M≤100,那么由于N的级数比较大,10^5,对每个年龄的人,如果人数超过100(当前的人已经按财富排好序了)那后后面的人可以舍弃,不会输出

//学习了

PAT 1055 The World's Richest[排序][如何不超时]的更多相关文章

  1. PAT 1055 The World's Richest

    #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #i ...

  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甲级1055 The World's Richest【排序】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805421066272768 题意: 给定n个人的名字,年龄和身价. ...

  4. PAT甲题题解-1055. The World's Richest (25)-终于遇见一个排序的不水题

    题目简单,但解题的思路需要转换一下,按常规思路肯定超时,推荐~ 题意:给出n个人的姓名.年龄和拥有的钱,然后进行k次查询,输出年龄在[amin,amx]内的前m个最富有的人的信息.如果财富值相同就就先 ...

  5. 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 ...

  6. PAT A1055 The World's Richest (25 分)——排序

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

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

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

  8. 1055 The World's Richest (25分)(水排序)

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

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

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

随机推荐

  1. phpcms二级栏目的调用

    1.二级栏目的调用方法 {php $data = subcat($module, $catid);} {loop $data $n $r} {if $r[ismenu]} {$r[catname]} ...

  2. 移动端meta 解释

    移动端meta 解释 <meta name="viewport" content="width=device-width, initial-scale=1.0, u ...

  3. mysql数据库,查看数据存放目录datadir

    需求描述: 在使用数据库,或者刚接手一个数据库时,可以查看该数据库的数据文件存放在什么位置. 操作过程: 1.通过查看datadir系统变量来查看数据目录 [mysql@redhat6 mysql-b ...

  4. 在懂得BREW接口的原理之后, 那么该知道BREW接口是如何声明和实现了

    参考:http://blog.csdn.net/peteryxk/article/details/1584514 首先介绍几个用到的宏定义: l         #define VTBL(iname) ...

  5. 第三章 Spring.Net 环境准备和搭建

    在前面一章我们介绍了依赖注入,控制反转的概念.接下来我们来真正动手搭建一下Spring.Net的环境,看一下Spring.Net 中的控制反转和依赖注入是什么样子. 3.1  Spring.Net 下 ...

  6. iis部署网站,使用虚拟路劲

    此前一直使用vs2010,没有考虑过配置IIS,但是一个项目完成后交付给甲方使用.肯定是要考虑IIS的安装和部署的.现从IIS的安装和asp.NET项目的部署两个方面讲解. IIS安装: 网上很多教程 ...

  7. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  8. 多线程模块:thread

    thread 常见用法如下: thread.start_new_thread(function, args):用于开启一个新的线程,接收两个参数,分别为函数和该函数的参数,相当于开启一个新的线程来执行 ...

  9. x64dbg使用心得

    使用ScyllaHide插件时 注意一下事项 xdbg64设置里启动 附加必须第一次断下在 系统断点 然后再启用ScyllaHide. 停止调试 脱离时.必须关闭ScyllaHide 否则会报异常 x ...

  10. 【markdown】使用 js 实现自己得markdown 网页编辑器

    首先从这里下载其浏览器版: https://github.com/evilstreak/markdown-js/releases 解压缩后在其js文件同目录下新建一个网页进行测试,代码如下: < ...