洛谷 P1803 线段覆盖 C语言

附上代码
#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)的排序会超时。
删除线格式
溜了溜了~~

发布了9 篇原创文章 · 获赞 0 · 访问量 334
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览