《ACM程序设计》书中题目 V

题目简要:

问题由多个测试用例组成。
在每个测试用例的第一行,有一个整数n,指定吉姆的书数。 n将是小于100的正整数。接下来的n行以名称年价格的格式给出书籍的信息。名称将是一个字符串,从字母表中最多有80个字符,年份和价格将是正整数。然后是排序标准,可以是名称,年份或价格。
您的任务是根据排序标准以非升序顺序升序排列图书列表。
注意:该名称是第一个条件,年是第二个,价格第三个。这意味着如果排序标准是“年”,并且您有两本具有相同年份的图书,则可以根据其姓名对它们进行排序。如果他们再次相等,根据他们的价格。没有两本书将在所有三个参数相同。
输入将由n = 0的情况终止。

对于每个测试用例,输出书目列表,每本书在一行中。在每一行,你应该输出格式名称年价格,三个参数应该只由一个空格分隔。
您应该在两个测试用例之间输出空行。

例如:

Sample Input

3
LearningGNUEmacs 2003 68
TheC++StandardLibrary 2002 108
ArtificialIntelligence 2005 75
Year
4
GhostStory 2001 1
WuXiaStory 2000 2
SFStory 1999 10
WeekEnd 1998 5
Price
0

Sample Output

TheC++StandardLibrary 2002 108
LearningGNUEmacs 2003 68
ArtificialIntelligence 2005 75

GhostStory 2001 1
WuXiaStory 2000 2
WeekEnd 1998 5
SFStory 1999 10
 
  
解题思路:
  这道题就是一个比较数组的问题,其实思路并不难,只需要比较就好了,首先先输入数据,分成三组输入,然后判断排序,过三个bool型的函数调用实现,最后按要求输出即可。
附代码:
#include <bits/stdc++.h>
using namespace std;
struct book
{
    string a;
    int b;
    int c;
}d[100];
bool CompareName(book e,book f)
{
    if (e.a!=f.a)
    return e.a<f.a;
    else if (e.b!=f.b)
    return e.b<f.b;
    else
    return e.c<f.c;
}
bool CompareYear(book e,book f)
{
    if (e.b!=f.b)
    return e.b<f.b;
    else if (e.a!=f.a)
    return e.a<f.a;
    else
    return e.c<f.c;
}
bool ComparePrice (book e,book f)
{
    if (e.c!=f.c)
    return e.c<f.c;
    else if (e.a!=f.a)
    return e.a<f.a;
    else
    return e.b<f.b;
}
int main()
{
    int n,j=0;
    while (cin>>n)
    {
        if (n==0)
        break;
    int i;
    string w;
    for (i=0;i<n;i++)
    cin>>d[i].a>>d[i].b>>d[i].c;
    cin>>w;
    if (w=="Name")
    sort (d,d+n,CompareName);
    if (w=="Year")
    sort(d,d+n,CompareYear);
    if (w=="Price")
    sort(d,d+n,ComparePrice);
    j++;
    if (j!=1)
    cout<<endl;
    for (i=0;i<n;i++)
        cout<<d[i].a<<" "<<d[i].b<<" "<<d[i].c<<endl;
    }
    return 0;
}
解题感受:
  这道题本身不难啦,通过比较,排序就可以排出顺序,将剩下的数组也依次排序就好了。最后注意输出就好啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值