猎户星系中某星区爆发局部战争,持久的战争使得战争机器被大量消耗,甚至一些100年前生产武器都被启封使用。Gand军前线新到一批武器,为N台重型机甲,每台机甲的信息为攻击力Atk(100<=Atk<=999)、防御力Def(100<=Def<=600)、已生产时间year(0<=year<=200)、编号Idx(1<=Idx<=N<=1000)。
前线指挥官需要根据机甲信息快速准备出战顺序,要求出战机甲以攻击力强大者优先出击,攻击力相同者以防御力强大者优先出击,防御力相同者以已生产时间较低者优先出击。请根据要求,输出前线新到机甲的参战次序。
输入格式:
第1行,一个正整数N,1<=N<=1000。(1~N为机甲编号)
第2行起输入N行,每行三个正整数,分别表示攻击力、防御力、已生产时间。
输出格式:
输出1行,按要求排序后的机甲编号。
输入样例:
5
566 160 50
160 320 106
700 500 2
700 160 123
700 160 115
输出样例:
3 5 4 1 2
#include<iostream>
#include<algorithm>
using namespace std;
struct jijia{//定义jijia数据类型,一个机甲所需提供的信息
int Atk,//攻击力
Def,//防御力
year,//已生产时间
Idx;//运抵前线时的编号
};
bool cmpAtk(jijia x,jijia y){//sort排序标准:按攻击力从大到小排序
return x.Atk > y.Atk ;
}
bool cmpDef(jijia x,jijia y){//sort排序标准:按防御力从大到小排序
return x.Def > y.Def ;
}
bool cmpyear(jijia x,jijia y){//sort排序标准:按已生产时间从小到大排序
return x.year < y.year ;
}
int N;
jijia a[1001];
int main(){
cin>>N;
for(int i=0;i<N;i++){
cin>>a[i].Atk>>a[i].Def>>a[i].year;
a[i].Idx = i+1;//编号从1开始
}
sort(a,a+N,cmpyear);//先按已生产时间排序
sort(a,a+N,cmpDef);//再按防御力排序
sort(a,a+N,cmpAtk);//最后才按攻击力排序
for(int i=0;i<N;i++){
cout<<a[i].Idx<<" ";
}
return 0;
}
解析:
由于一个机甲个体有四个标签:编号、攻击力、防御力、已生产时间。使用结构(struct)自定义数据类型会有利于整体排序。
由于“以攻击力强大者优先出击,攻击力相同者以防御力强大者优先出击,防御力相同者以已生产时间较低者优先出击”,从中最高优先级应该是已生产时间,然后是防御力,最后是攻击力。所以排序的优先级就为:已生产时间==》防御力==》攻击力。
sort函数是C++的<algorithm>库提供的排序函数,其第三项可以通过自定义来设置排序参考对象和排序方式,当然也可以使用其它的排序方式。