【1062 25 排序】 Talent and Virtue

传送门

题意

给定 \(n\) 个人,每个人包含 \(id,talent,virtue\),给定\(l,h\),根据给定信息将人分成 \(4\) 类,

  • 如果 \(talent,virtue < l\) ,不计入
  • 如果 \(talent,virtue\geq h\)\(a\)
  • 如果 \(talent < h,virtue\geq h\) 记为 \(b\)
  • 如果 \(talent,virtue < h\) 并且 \(virtue \geq talent\) 记为 \(c\)
  • 其余记为 \(d\)

每一类中按照 \(talent+virtue\) 降序排序,一样时按照 \(virtue\) 降序,再一样按照 \(id\) 升序,按给定格式输出

数据范围

\(n\leq 10^{5}\)

题解

  • 排序即可,通过数组可以减少代码量

Code

#include<bits/stdc++.h>
using namespace std;
#define sz size
#define pb push_back
struct node{
    int id,tal,vir,tot;
    bool operator <(const node t) const {
        if(tot==t.tot){
            if(vir==t.vir) return id<t.id;
            return vir>t.vir;
        }
        return tot>t.tot;
    }
};
int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    int n,l,h; cin>>n>>l>>h;
    vector<node>v[4];
    for(int i=0;i<n;i++){
        int id,tal,vir,tot; cin>>id>>vir>>tal; tot=tal+vir;
        node t={id,tal,vir,tot};
        if(tal<l || vir<l) continue;
        else if(tal>=h && vir >= h) v[0].pb(t);
        else if(tal<h && vir>=h) v[1].pb(t);
        else if(tal>=l && tal<h && vir>=l && vir<h && vir>=tal ) v[2].pb(t);
        else v[3].pb(t);
    }
    int cnt=0;
    for(int i=0;i<4;i++) sort(v[i].begin(),v[i].end()),cnt+=v[i].sz();
    cout<<cnt<<endl;
    bool pre=0;
    for(int i=0;i<4;i++){
        if(v[i].sz() && pre) printf("\n");
        for(int j=0;j<v[i].sz();j++){
            if(!j) printf("%08d %d %d",v[i][j].id,v[i][j].vir,v[i][j].tal);
            else printf("\n%08d %d %d",v[i][j].id,v[i][j].vir,v[i][j].tal);
            pre=1;
        }
    }
}
posted @ 2021-02-27 00:22  Hyx'  阅读(55)  评论(0)    收藏  举报