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

HDU 5214 Movie【贪心】

时间:2015-05-03 15:59:25      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出n,l[1],r[1],a,b,c,d 其中 l[i]=l[i-1]*a+b,r[i]=r[i-1]*c+d;

问能否从这n个区间中选出不相交不重叠的三个区间

看的题解

先考虑最左边的区间,找出最小的rmin,即为最左边的区间,这样能够给剩下的两个区间腾出更多的选择空间

 

再考虑最右边的区间,找出最大的lmax,即为最右边的区间,这样也能够为剩下的一个空间腾出更多的选择空间

 

如果存在一个区间的l[i]>rmin,r[i]<lmax,那么就是“YES”

如果在这样的条件下都不存在,那就是"NO"

学习的----代码-

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 
14 typedef long long LL;
15 const int INF = (1<<30)-1;
16 const int mod=4294967296;
17 const int maxn=10000005;
18 
19 unsigned int  l[maxn],r[maxn];
20 
21 int main(){
22     int T;
23     scanf("%d",&T);
24     while(T--){
25         memset(l,0,sizeof(l));
26         memset(r,0,sizeof(r));
27         
28         unsigned int n,a,b,c,d;
29         cin>>n>>l[1]>>r[1]>>a>>b>>c>>d;
30         
31         for(int i=2;i<=n;i++) l[i]=l[i-1]*a+b;
32         for(int i=2;i<=n;i++) r[i]=r[i-1]*c+d;
33         
34         for(int i=1;i<=n;i++)
35         if(l[i]>r[i]) swap(l[i],r[i]);
36         
37         int minn=r[1],maxx=l[1];
38         for(int i=1;i<=n;i++){
39             if(l[i]>maxx) maxx=l[i];
40             if(r[i]<minn) minn=r[i];
41         }
42         
43         int flag=0;
44         for(int i=1;i<=n;i++){
45             if(l[i]>minn&&r[i]<maxx){
46                 flag=1;
47                 break;
48             }
49         }
50         
51         if(flag) printf("YES\n");
52         else printf("NO\n");                
53     }
54     return 0;
55 }
View Code

 

HDU 5214 Movie【贪心】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4474026.html

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