《ACM书中题目》 V

  • 原题

    Description
    Jim is fond of reading books, and he has so many books that sometimes it’s hard for him to manage them. So he is asking for your help to solve this problem.

    Only interest in the name, press year and price of the book, Jim wants to get a sorted list of his books, according to the sorting criteria.

    Input
    The problem consists of multiple test cases.

    In the first line of each test case, there’s an integer n that specifies the number of books Jim has. n will be a positive integer less than 100. The next n lines give the information of the books in the format Name Year Price. Name will be a string consisting of at most 80 characters from alphabet, Year and Price will be positive integers. Then comes the sorting criteria, which could be Name, Year or Price.

    Your task is to give out the book list in ascending order according to the sorting criteria in non-ascendent order.

    Note: That Name is the first criteria, Year is the second, and Price the third. It means that if the sorting criteria is Year and you got two books with the same Year, you’d sort them according to their Name. If they equals again, according to their Price. No two books will be same in all the three parameters.

    Input will be terminated by a case with n = 0.

    Output
    For each test case, output the book list, each book in a line. In each line you should output in the format Name Year Price, the three parameters should be seperated by just ONE space.

    You should output a blank line between two test cases.

  • 理解&思路
    本题是一个三维排序问题,给出多组数据,按一定规则排序。
    因为题目中指定排序优先级,所以定义三个排序方式,根据题目指定安排不同的排序规则最后输出。

  • AC代码

#include<bits/stdc++.h>
using namespace std;
struct book{
    string name;
    int year;
    int price;
};
bool cmpName(const book &a, const book &b){
    if(a.name != b.name) 
        return a.name < b.name;
    else if(a.year != b.year)
        return a.year < b.year;
    else
        return a.price < b.price;
}

bool cmpYear(const book &a, const book &b){
    if(a.year != b.year)
        return a.year < b.year;
    else if(a.name != b.name)
        return a.name < b.name;
    else
        return a.price < b.price;
}

bool cmpPrice(const book &a, const book &b){
    if(a.price != b.price)
        return a.price < b.price;
    else if (a.name != b.name)
        return a.name < b.name;
    else
        return a.year < b.year;
}

int main(){
    int n;
    vector<book> v;
    book bk;
    string sorting;
    int line = 0;
    while(cin >> n){
        if(n == 0)
            break;
        v.clear();
        line++;
        for(int i = 0; i < n; i++){
            cin >> bk.name >> bk.year >> bk.price;
            v.push_back(bk);
        }
        cin >> sorting;
        if(sorting == "Name")
            sort(v.begin(), v.end(), cmpName);
        else if (sorting == "Year")
            sort(v.begin(), v.end(), cmpYear);
        else
            sort(v.begin(), v.end(), cmpPrice);
        if(line != 1)
            cout << endl;
        for(int i = 0; i < n; i++)
            cout << v[i].name << " " << v[i].year << " " << v[i].price << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值