题目链接:广大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;
}
}