【GZOJ】1373——凹酱的行程

10 篇文章 0 订阅
8 篇文章 0 订阅

题目链接广大OJ1373
本题亦为广大15级第一次周赛的C题。

题目内容

Problem Description
悠木碧(以下通称凹酱,昵称来源请百度)是一位活跃在声优界的女性声优,同时也作为偶像活跃着。

由于凹酱的人气不断上升,她的日程安排也越来越满。

凹酱每天都会接到不同的任务(就是配音啊演唱会啊之类的,以下统称为LIVE),以及不固定时间的训练(以下统称为Practice),再加上她每天都有想玩的游戏(这也是日程的一部分哦)(凹酱玩游戏很厉害的=w=)(以下统称为Game),她的日程表堆得非常乱,甚至搞不清楚哪一天要做什么事。

现在,你需要做出一个程序,帮助凹酱来让她的日程表有序一些。

按照她的期望,日程表应该是这样排的:

1.按日期排

2.按活动内容排序,LIVE要优先于Practice,而Practice要优先于Game

例如说,有如下日程表:

3月22日 LIVE

2月1日 Game

3月22日 Practice

4月7日 Game

那么整理有序之后就应该是这样的:

2月1日 Game

3月22日 LIVE

3月22日 Practice

4月7日 Game

Input
多组输入数据

每组数据的第一行为n(1<=n<=1000),表示凹酱的日程表里有几个日程。

接下来有n行,每一行包括两个数字m(表示月份),d(表示日数)和一个字符串(这个字符串只有“LIVE”,“Game”,“Practice”三种可能),分别用空格隔开。

Output
对于每组输入数据,输出整理好的日程表,具体格式参照样例。

每输出一组输出数据就要打一个空行。

Sample Input
3
1 1 LIVE
8 7 LIVE
9 10 Game
4
3 22 LIVE
6 7 LIVE
2 22 Practice
3 22 Game
2
6 6 Game
6 6 Practice
Sample Output
1 1 LIVE
8 7 LIVE
9 10 Game

2 22 Practice
3 22 LIVE
3 22 Game
6 7 LIVE

6 6 Practice
6 6 Game
Hint
接到整理好的日程表之后的凹酱选择了取消所有日程(喂!)

解题思路

请无视Hint我家凹酱才不会那么不认真!
咳,跑题了。
这道题就是简单的结构体的应用和STL排序函数的重载比较函数的简单应用。
结构体的话参照c++的第五章,这里主要说说STL自带的排序函数。
C++的标准模板库(STL)里有一个现成的排序函数sort可以进行排序。
通俗的使用格式如下所示:
sort(头指针,尾指针,可缺省的比较函数)
使用示例:对数组a[5]={2,1,3,6,4}进行从小到大的排序。只需要用sort(a,a+5);这个语句就可以了。
sort函数使用的是一种叫快速排序的算法,它的排序速度远远快于冒泡排序啊选择排序之类的。
sort函数默认从小到大排序,那么要是要让它按照其他排序准则(例如说从大到小)排序的话就需要自己写一个比较函数了。
例如说,要从大到小排序,那么就需要写这样一个比较函数:

bool compare(int a,int b)
{
    return a>b;
}

只需要将这个比较函数加入sort函数里面就可以了,就像这样:

sort(a,a+5,compare);

而对于结构体的排序,重载比较函数的功能就更为强大。
例如说,现在定义一个结构体:

struct point
{
    int x;
    int y;
};

然后用这个结构体定义数组point a[1000];
假设这个数组a已经有输入了,要对其进行排序,按x的从小到大排序,如果x相同的话就按y的从小到大排序。那么就可以拟一个这样的比较函数:

bool compare(point a,point b)
{
    return a.x<b.x||(a.x==b.x&&a.y<b.y);
}

然后调用该比较函数即可:

sort(a,a+1000,compare);

使用这个方法就能很容易地做出这道题了。

代码

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct f
{
    int month;
    int day;
    string s;
};
bool compare(f a,f b)
{
    if(a.month<b.month)return true;
    else if(a.month==b.month)
    {
        if(a.day<b.day)return true;
        else if(a.day==b.day)
        {
            int aa,bb;
            if(a.s=="Game")aa=1;
            else if(a.s=="Practice")aa=2;
            else if(a.s=="LIVE")aa=3;
            if(b.s=="Game")bb=1;
            else if(b.s=="Practice")bb=2;
            else if(b.s=="LIVE")bb=3;
            if(aa>bb)return true;
            return false;
        }
        return false;
    }
    return false;
}
int main()
{
    int n;
    while(cin>>n)
    {
        f a[1000];
        for(int i=0;i<n;i++)cin>>a[i].month>>a[i].day>>a[i].s;
        sort(a,a+n,compare);
        for(int i=0;i<n;i++)
        {
            cout<<a[i].month<<' '<<a[i].day<<' '<<a[i].s<<endl;
        }
        cout<<endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值