现在的位置: 首页 > 综合 > 正文

九度笔记之 1346:会员积分排序

2013年12月02日 ⁄ 综合 ⁄ 共 1855字 ⁄ 字号 评论关闭

题目1346:会员积分排序

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:668

解决:270

题目描述:

元旦佳节快到了,超市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
****************************************************************/

抱歉!评论已关闭.