链接
http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=3075
题目:
Description
自从电子竞技在中国被认定为第99个正式体育项目,教主就投身其中,CS(Counter Strike 反恐精英)是他拿手的一款游戏,有很多职业选手为之付出。
反恐精英中有各种不同的枪械,我们为了简化问题,规定每种枪有自己的名字、杀伤力、价格。
下面要求你按照如下规定给已知的枪支排序:
要求按照枪支的攻击力排序(由大到小),如果某些枪的攻击力相同则对这些枪按照价格排序(由小到大),
如果某些枪的价格相同则对这些枪按照名字的字典序排列。
(本题中若字符串a,b满足 strcmp(a, b) < 0 即满足字典序)
Input
本题只有一组测试数据
第一行:N (1 <= N <= 100000) 表示有N种枪
第1..1 + N行:首先是枪支的名字(只包括大写字母、数字,最长占10个字符),接着是两个数字A (0 <= A <= 1000) B (0 <= B <= 1000) A代表杀伤力,B代表价格
Output
排序后,每行输出一种枪的名字
Sample Input
7
AK47 500 200
AWP 1000 500
USP 50 20
M4A1 500 300
MP5 200 100
MP3 200 100
MP4 200 100
Sample Output
AWP
AK47
M4A1
MP3
MP4
MP5
USP
Hint
输入量巨大,建议使用scanf()与printf(),使用cin与cout可能会超时
解题思路:
方法一:简单得结构体排序
方法二:STL中set的做法
代码:
方法一:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
struct Weapon
{
string name;
int power;
int price;
}w[maxn];
int cmp(Weapon a , Weapon b)
{
if(a.power == b.power)
{
if(a.price == b.price)
return a.name < b.name;
else
return a.price < b.price;
}
else
return a.power > b.power;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0; i < n ; i++)
{
cin>>w[i].name>>w[i].power>>w[i].price;
}
sort(w,w+n,cmp);
for(int i = 0; i < n; i++ )
{
cout<<w[i].name<<endl;
}
return 0;
}
方法二:
#include<bits/stdc++.h> using namespace std; const int maxn = 100005; struct Weapon { string name; int power; int price; int operator < (const Weapon &w)const ///重载小于号,可以直接比较结构体 { if(power == w.power) { if(price == w.price) return name < w.name; else return price < w.price; } else return power > w.power; } }; set<Weapon>s; int main() { std::ios::sync_with_stdio(false); int n; scanf("%d",&n); s.clear(); Weapon W; for(int i = 0; i < n ; i++) { cin>>W.name>>W.power>>W.price; s.insert(W); } set<Weapon>::iterator iter; for(iter = s.begin(); iter != s.end(); iter++) { cout<<iter->name<<endl; //或者:cout<<(*iter).name<<endl; } return 0; }