贪心 赛码 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

时间: 2024-11-05 16:34:45

贪心 赛码 1001 Movie的相关文章

赛码网算法:认老乡

最近在赛码网上做算法题,看到这样一道题,经过不断的学习,最后解决了.把我的思想和代码给大家分享一下~ 认老乡 题目描述大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷.但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗? 输入每个测试实例首先包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*

赛码网线上PHP编译器报错

360笔试题,在赛码网提交后报错“Runtime Error:[ERROR] A Not allowed system call: runid:6660947 callid:25” 题目链接:http://exercise.acmcoder.com/online/online_judge_ques?ques_id=3980&konwledgeId=42 报错内容: 产生该错误的代码: 申明:不是因为代码逻辑原因产生错误,首先代码逻辑是按照官方给出的答案通过php实现:其次,同样的用例在本地运行(

赛码网的一道百度编程题

最近偶尔接触到这个赛码网,看了百度的一道编程题,于是尝试了一下,发现虽然天天写代码实现这个居然花了我好长时间,仍然没有通过全部案例.目前给的通过率是83% 题目如下: 小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大.她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z.之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ.之后则是三位.四位.五位--字母编号的,规则类似. 表格单

ACM 五一杭电赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛小记

对于这项曾经热爱的竞赛,不得不说这是我最后一年参加ACM比赛了,所以要珍惜每一次比赛的机会. 五一去杭电参加了赛码"BestCoder"杯中国大学生程序设计冠军赛,去的队伍包括了今年19支World final的队伍,几乎是全国最强的46所学校各出了一个代表队,十分感谢学校给了我这个大三的老年血手这次去比赛的机会. 比赛在5.2一天内完成,上午的热身赛居然是上一场Bestcoder的原题= =.虽然我们三个人都没做过...不过我还是水水的写了前两道题. 在中午的悲惨淋雨后,下午正赛开始

赛码网 5.12周考

本来都不想写下去了,后来想想,还是写写吧!以后回过头来看看,就可以说,哦,那些时间去做这个了! 下面步入正题. 赛码网 5.12周考 题目挺难的,反正我2道题目都没有做出来,官网上也没有贴出来答案,就只好自己去找了. 1. 暴力搜索肯定是不行的,时间复杂度很高,只好找一种数个数的方法,没有想到. 题解链接:http://krydom.com/bzoj1801/ 解释的应该很详细,但是我有一点疑问, 放2个到一个空列上 与 放一个到只有一个的列上,另一个放到空列上, 这两种的转移方式 应该是不同的

递推DP 赛码 1005 Game

题目传送门 1 /* 2 递推DP:官方题解 3 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 4 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩下i − 1个人时的位置 5 (假设BrotherK所处的位置是1),然后利用之前计算出的F值判定此人是否可能获胜 6 时间复杂度为O(n3) 7 dp[i][j] 表示有i个人,j位置的人是否可能胜利.dp[1][0] = 1; cnt = sum (dp[n][i]); 8 有最

赛码网算法: 上台阶 ( python3实现 、c实现)

上台阶 题目描述 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法. 输入输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数.样例输入223输出对于每个测试实例,请输出不同走法的数量.样例输出12时间限制C/C++语言:2000MS其它语言:4000MS 内存限制C/C++语言:65537KB其它语言:589825KB

赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛1001——Movie

Problem Description Cloud and Miceren like watching movies. Today, they want to choose some wonderful scenes from a movie. A movie has N scenes can be chosen, and each scene is associate with an interval [L, R]. L is the beginning time of the scene a

赛码&quot;BestCoder&quot;杯中国大学生程序设计冠军赛

渣渣一枚 总共做了4个题目.先总结下吧.题目质量很高. 题目链接 1001 这个题目第一眼就是hdu之前的题目今年暑假不AC.只选三个,那么就是左右两边贪心取优. #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #define MOD 4294967296 using namespace std; typedef unsigned int LL; int T; i