【1055 25 排序】 The World's Richest
传送门
题意
给定 \(n\) 个富豪的信息 \((name,age,worth)\),\(m\) 个询问,每个询问最大输出数量 \(mx\) 区间 \(l,r\) ,求年龄在这个区间的富豪按照 \(worth\) 降序排列,如果相同按照 \(age\) 升序,如果两个都相同按照 \(name\) 字典序升序
数据范围
\(n\leq 10^{5}\)
\(m\leq 10^{3}\)
\(age\in [0,200]\)
\(mx\leq 100\)
题解
- 每次最多输出 \(100\) 个排序后,从小到大,将每个年龄最大的 \(100\) 保存
- 流输入输出和
string比较慢 - 玄学问题,多交几次,有的时候能过,有的时候过不了
Code
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
struct node {
char name[10];
int age,wor;
bool operator < (const node t)const {
if(wor==t.wor){
if(age==t.age){
return strcmp(name, t.name) < 0;
}
return age<t.age;
}
return wor>t.wor;
}
};
int rec[210];
int main(){
int n,m; scanf("%d%d",&n,&m);
vector<node>a(n),b;
for(int i=0;i<n;i++) scanf("%s%d%d",a[i].name,&a[i].age,&a[i].wor);
sort(a.begin(),a.end());
for(int i=0;i<n;i++){
if(rec[a[i].age]<100){
b.pb(a[i]);
rec[a[i].age]++;
}
}
for(int i=1;i<=m;i++){
int mx,l,r; scanf("%d%d%d",&mx,&l,&r);
vector<node>res;
for(int j=0;j<b.size();j++){
if(b[j].age>=l && b[j].age<=r) res.pb(b[j]);
}
if(i!=1) printf("\n");
printf("Case #%d:",i);
if(res.size()){
for(int j=0;j<res.size() && j<mx;j++){
printf("\n%s %d %d",res[j].name,res[j].age,res[j].wor);
}
} else printf("\nNone");
}
}

浙公网安备 33010602011771号