题目描述
“饱了么”推出了免单活动(免单:即订单金额退还,某一笔订单免单了代表这一笔订单不需要花钱)。
有 n(1≤n≤2000)个顾客点了外卖,第 i个人点外卖的时间为 ai(0≤ai≤23 小时 bi(0≤bi≤59) 分,花了 ci(1≤ci≤5000)元,以上数据均为整数。
花钱最多的 m(0≤m≤n)个人可以获得免单。如果有多人花钱一样多,则点单较早的顾客可以优先获得免单资格。
请问,哪些顾客可以被免单呢?
输入描述:
共 n+1 行。 第 1 行共两个数字,分别代表 n 和 m; 第 2 到 n+1 行,每行三个整数 ai,bi,ci;
输出描述:
共输出 m 行,每行 3 个数,分别代表每名获得免单的顾客的下单时间(时、分),以及这个顾客的下单金额。使用空格隔开。 消费金额更高的顾客将会优先输出,如果下单金额相同,则下单时间早的顾客优先输出。(如果无法理解可以先阅读样例和样例解释)。
思路:
本题只要对所有的数据进行排序即可,可将所有数据包装成结构体或一个类,定义一个结构体或者类数组,然后对其排序。排序时按照订单金额降序排列,订单金额相同时按照订单时间升序排列,优先付款的排在前面,然后输出前m个数据;
#include<iostream>
#include<algorithm>
using namespace std;
//存放数据的类
class pp
{
public:
int a,b,c;
};
//自定义比较函数
bool cmp(pp p1,pp p2)
{
if(p1.c!=p2.c)
{
if(p1.c>p2.c)
{
return true;//p1排在左边
}
else
{
return false;//p2排在左边
}
}
else if(p1.a!=p2.a)
{
if(p1.a<p2.a)
{
return true;//p1排在左边
}
else
{
return false;//p2排在左边
}
}
else if(p1.b!=p2.b)
{
if(p1.b<p2.b)
{
return true;//p1排在左边
}
else{
return false;//p2排在左边
}
}
else
{
return true;
}
}
int main()
{
int n,m;
pp p[2010];
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>p[i].a>>p[i].b>>p[i].c;
}
sort(p+1,p+n+1,cmp);
for(int i=1;i<=m;i++)
{
cout<<p[i].a<<" "<<p[i].b<<" "<<p[i].c<<endl;
}
return 0;
}