附上代码
#include<stdio.h>
typedef struct{
int s_time;//结构体定义,开始的时间,结束的时间,时间间隔
int e_time;
int interval;
}game;
void QuickSort(game a[],int s,int e);//快排
int main()
{
int n;
scanf("%d",&n);
game a[n];
for(int i = 0;i < n;i++)
{
scanf("%d%d",&a[i].s_time,&a[i].e_time);
a[i].interval = a[i].e_time - a[i].s_time;
}
QuickSort(a,0,n - 1);//排序,按照结束的时间排序,结束时间早的排在前面
int result = 0;
int i = 1;
int last = a[0].e_time; //结束时间最早的赋给last
while(i < n)
{
while(a[i].s_time < last)//下一个的开始时间晚于第一个的结束
//时间,跳出循环,即可以参加下一场比赛
i++;
result++;
last = a[i].e_time;//更新last的值
}
printf("%d",result);
return 0;
}
void QuickSort(game a[],int s,int e)
{
if(s >= e)
return ;
else
{
int i = s,j = e;
while(i != j)
{
while(i < j&&((a[i].e_time < a[j].e_time)||
(a[i].e_time == a[j].e_time&&a[i].interval <= a[j].interval)))
j--;
game temp1 = a[i];
a[i] = a[j];
a[j] = temp1;
while(i < j&&((a[i].e_time < a[j].e_time)||
(a[i].e_time == a[j].e_time&&a[i].interval <= a[j].interval)))
i++;
game temp2 = a[i];
a[i] = a[j];
a[j] = temp2;
}
QuickSort(a,s,i - 1);
QuickSort(a,i + 1,e);
}
}
删除线格式
这道贪心题主要在于如何将数组排序才能使其参加尽量多的比赛。
所以我们每回选择的对象都应该是对后续影响最小的,结束时间最早的比赛对后面的影响最小,在结束时间相同的情况下,哪场比赛持续的时间短,哪场比赛就对我们有利,就应该排在前面。
所以在排序的时候,要考虑两个因素,根据结束的时间和持续的时间进行排序。
定义last为最早的结束时间,在循环中向后找,直到找到一场比赛的开始时间大于等于last,就可以参加这场比赛,result + 1,然后把last更新为当下的比赛的结束时间,继续循环重复上述过程。
本题的突破点在于排序的方式,如果能想到按结束时间排序,就不难写出程序。AC也不再困难。
排序时要使用快排或者归并,c++自带sort和python自带的sorted都可以满足时间的要求,时间复杂度为o(n2)的排序会超时。
删除线格式
溜了溜了~~