题目1346:会员积分排序
-
题目描述:
-
元旦佳节快到了,超市A想要给会员一些奖品。但是奖品有限,所以它需要给这些会员做一个排序,然后将名单输出来。排序的规则是,先按积分排序,如果会员的积分相同则按他的ID排序,因为ID号小则表示他注册的时间早。
现在某超市有每个会员的ID(ID保证不重复)、积分,它想要请你帮忙给排个序。
-
输入:
-
输入有多组数据。
每组第一行输入n(1<=n<=1000),m(1<=m<=50),n表示会员个数,m表示奖品个数;之后N行分别是两个整数id和s,id为这个会员的ID,s代表了这个会员的积分。
-
输出:
-
对每组输入输出min(m,n)个获奖的会员ID(按积分降序输出,如果积分相同按ID升序输出),每个会员ID一行。
-
样例输入:
-
5 3 1 5 2 10 3 3 4 20 5 2
-
样例输出:
-
4 2 1
算法分析
关键在于排序算法中所用比较函数的书写,和 1339:ACM 是同一类型的题目
先判断积分相同情况下,根据ID进行比较
再根据积分进行比较。
这样的写法,代码比较简洁。
bool preThan(const member& ta,const member& tb){
if(ta.points == tb.points)
return ta.id<tb.id;
else
return ta.points>tb.points;
}
源程序
程序中需要注意的是判断 nmember 和nprice的大小
//============================================================================
// Name : judo1346.cpp
// Author : wdy
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct member{
public:
int id;
int points;
public:
member(int id_,int points_):id(id_),points(points_){};
};
bool preThan(const member& ta,const member& tb){
if(ta.points == tb.points)
return ta.id<tb.id;
else
return ta.points>tb.points;
}
void sortMember(int nmember,int nprice){
std::vector<member> ts;
int id;
int points;
for(int i = 0; i<nmember; i++){
std::cin>>id>>points;
ts.push_back(member(id,points));
}
std::sort(ts.begin(),ts.end(),preThan);
if(nmember<nprice)
nprice = nmember;
for(int i = 0;i<nprice;i++){
std::cout<<ts[i].id<<std::endl;
}
}
void judo(){
int nmember;
int nprice;
while(std::cin>> nmember>> nprice){
sortMember(nmember,nprice);
}
}
int main() {
judo();
//cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
return 0;
}
/**************************************************************
Problem: 1346
User: KES
Language: C++
Result: Accepted
Time:280 ms
Memory:1520 kb
****************************************************************/