码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 5214 Movie ->贪心+自然溢出取模->水题里的学问

时间:2015-05-18 23:03:05      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

分析:贪心,首先找到最右边的第一个左边界和最左边的第一个右边界。之后在判断是否有一个及一个以上的区间在这两个值之间,若有则能找到符合题意的三个区间,否则不能。

注意:这里利用的unsigned int的自然溢出决解了取模问题;第二个是一定生成完数据后在交换Li和Ri的值,这里被坑残了。

#include<iostream>
using namespace std;

//__int64 mod=4294967296;由于4294967296-1刚好是unsigned int类型的最大值,对它取模就相当于unsigned int溢出了
unsigned int L[10000005],R[10000005];       //因此这里不需要取模,利用溢出就相当于取摸了。

int main()
{
	unsigned int T,N,L1,R1,a,b,c,d,i;
	unsigned int max,min;
	bool ok;

	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d%d%d%d%d%d",&N,&L1,&R1,&a,&b,&c,&d);
		i=0;
		L[i]=L1;
		R[i++]=R1;
		for(;i<N;i++)
		{
			L[i]=L[i-1]*a+b;
			R[i]=R[i-1]*c+d;
		}

		for(i=0;i<N;i++)       //生成完数据后才能交换
			if(L[i]>R[i]) swap(L[i],R[i]);

		max=L[0];
		min=R[0];
		for(i=1;i<N;i++)
		{
			max=L[i]>max?L[i]:max;           //找到最右边的第一个左边界
			min=R[i]<min?R[i]:min;           //找到最左边的第一个右边界
		}
		ok=false;
		for(i=0;i<N;i++)
			if(L[i]>min && R[i]<max) //如果存在一个区间在上述求出的最大值和最小值之间,则可以找到,否则不能
			{
				ok=true;
				break;
			}
		if(ok)
			puts("YES");
		else
			puts("NO");
	}
	return 0;
}


HDU ACM 5214 Movie ->贪心+自然溢出取模->水题里的学问

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/45827571

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!