【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");
    }
}
    
posted @ 2021-02-24 22:19  Hyx'  阅读(80)  评论(0)    收藏  举报