贪心 赛码 1001 Movie

 

题目传送门

 1 /*
 2     贪心:官方题解:
 3         首先我们考虑如何选择最左边的一个区间
 4         假设最左边的区间标号是i, 那选择的另外两个区间的左端点必定要大于Ri
 5         若存在i之外的j, 满足Rj<Ri, 那么另外两个区间的选择余地必定不会减少
 6         因此,为了使另外两个区间有尽可能多的选择,我们选择一个右端点最小的区间作为最左边的区间是最好的
 7         同理,我们选择一个左端点最大的区间作为最右边的区间,也将提供最多的选择
 8         确定了这两个区间之后,只需判断是否存在一个区间位于它们中间且不交叉即可
 9         本题的取模值十分特殊,用unsigned int的自然溢出可以达到同样的效果
10         时间复杂度O(N)
11     解题关键:if (mn_r < node[i].l && node[i].r < mx_l),存在这样的一个区间满足条件就YES!
12     反思:首先没有想到贪心的投机方法,用暴力DFS搜索超时,unsigned int的范围: 0 ~ 4294967295 这个取模自然溢出也是醉了:)
13     补充:HDOJ 2037 今年暑假不AC 升级版
14 */
15 #include <cstdio>
16 #include <iostream>
17 #include <algorithm>
18 #include <cstring>
19 #include <string>
20 #include <map>
21 #include <vector>
22 #include <set>
23 #include <cmath>
24 #include <queue>
25 using namespace std;
26 const int MAXN = 10000000 + 10;
27 const long long  INF = 0x3f3f3f3f;
28 struct Node
29 {
30     unsigned int l, r;
31 }node[MAXN];
32 
33 int main(void)        //赛码 1001 Movie
34 {
35     //freopen ("A.in", "r", stdin);
36 
37     int t, n;
38     unsigned int a, b, c, d;
39     scanf ("%d", &t);
40     while (t--)
41     {
42         scanf ("%d%d%d%d%d%d%d", &n, &node[1].l, &node[1].r, &a, &b, &c, &d);
43 
44         for (int i=2; i<=n; ++i)
45         {
46             node[i].l = node[i-1].l * a + b;
47             node[i].r = node[i-1].r * c + d;
48         }
49         for (int i=1; i<=n; i++)
50         {
51             if (node[i].l > node[i].r)    swap (node[i].l, node[i].r);
52         }
53 
54         unsigned int mn_r = 4294967295UL, mx_l = 0;
55         for (int i=1; i<=n; ++i)
56         {
57             if (mn_r > node[i].r)    mn_r = node[i].r;
58             if (mx_l < node[i].l)    mx_l = node[i].l;
59         }
60 
61         if (mn_r > mx_l)
62         {
63             puts ("NO");    continue;
64         }
65 
66         bool flag = false;
67         for (int i=1; i<=n; ++i)
68         {
69             if (mn_r < node[i].l && node[i].r < mx_l)
70             {
71                 flag = true;    puts ("YES");    break;
72             }
73         }
74         if (!flag)    puts ("NO");
75     }
76 
77     return 0;
78 }
 1 /*
 2     贪心水题
 3 */
 4 #include <cstdio>
 5 #include <iostream>
 6 #include <algorithm>
 7 using namespace std;
 8 
 9 const int MAXN = 1e2 + 10;
10 const int INF = 0x3f3f3f3f;
11 struct Node
12 {
13     int l, r;
14 }node[MAXN];
15 
16 bool cmp(Node x, Node y)
17 {
18     if (x.r == y.r)    return x.l < y.l;
19 
20     return x.r < y.r;
21 }
22 
23 int main(void)        //HDOJ 2037 今年暑假不AC
24 {
25     //freopen ("HDOJ_2037.in", "r", stdin);
26 
27     int n;
28     while (scanf ("%d", &n) == 1)
29     {
30         if (n == 0)    break;
31 
32         if (n == 1)
33         {
34             puts ("1");        continue;
35         }
36 
37         for (int i=1; i<=n; ++i)
38         {
39             scanf ("%d%d", &node[i].l, &node[i].r);
40             if (node[i].l > node[i].r)    swap (node[i].l, node[i].r);
41         }
42 
43         sort (node+1, node+1+n, cmp);
44 
45         int cnt = 1;
46         int tmp = node[1].r;
47         for (int i=2; i<=n; ++i)
48         {
49             if (node[i].l >= tmp)
50             {
51                 tmp = node[i].r;    ++cnt;
52             }
53         }
54 
55         printf ("%d\n", cnt);
56     }
57 
58     return 0;
59 }
HDOJ 2037 今年暑假不AC

 

posted @ 2015-05-03 13:28  Running_Time  阅读(168)  评论(0编辑  收藏  举报