【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;
}
}
}

浙公网安备 33010602011771号