HDU2073(暴力) VS HDU5214(贪心)

题意:给出n组l[i],r[i],求出能够相互嵌套的最大个数;

思路:2073数组大小为100,纯暴力就可以了,不过注意排序时,按照r的顺序从小到大;

5214数组大小为10000000,纯暴力的话绝对超时,但是要求能找到3组的时候就输出YES即可,因此从两边贪心就好了,本来以为排序更方便一些,不过TLE了,改成找最大最小就好了;

误区:我以为的是图论,求最长路径(bellman-ford可以求最长路,只要吧权值改成相反数即可),其实适用于2073,不过大材小用了,而且判的很严格,容易MLE,TLE;

2073代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cstdlib>
 6 #define repu(i,a,b) for(int i=a;i<b;i++)
 7 #define N 1100
 8 #define MOD 4294967296
 9 #define ll long long
10 using namespace std;
11 int vis[N];
12 struct S
13 {
14     int l,r;
15     bool operator < (const S& p) const
16     {
17         if(r == p.r)
18             return l < p.l;
19         return r < p.r;
20     }
21 } m[N];
22 int main()
23 {
24     int T,n,a,b,c,d;
25     while(cin>>n&&n)
26     {
27         repu(i,0,n)
28         cin>>m[i].l>>m[i].r;
29         sort(m,m+n);
30         memset(vis,0,sizeof(vis));
31         int maxn = 0;
32         int u = m[0].r,v= m[0].l;
33 //        repu(i,0,n)
34 //        cout<<m[i].l<<" "<<m[i].r<<endl;
35         repu(i,0,n)
36         {
37             repu(j,i+1,n)
38             {
39                 if(u <= m[j].l && v < m[j].l)
40                 {
41                     u = m[j].r;
42                     v = m[j].l;
43                     vis[i]++;
44                 }
45             }
46             vis[i]++;
47             // cout<<vis[i]<<endl;
48             maxn = max(vis[i],maxn);
49         }
50         cout<<maxn<<endl;
51     }
52     return 0;
53 }

5214代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define MOD 4294967296
 6
 7 using namespace std;
 8 typedef unsigned int LL;
 9 int T;
10 int n;
11 const int N=10000005;
12 LL s1,e1;
13 LL L1,R1,L2,R2;
14 LL minL,minR,maxL,maxR;
15 LL a,b,c,d;
16 LL l[N],r[N];
17 int main()
18 {
19     scanf("%d",&T);
20     while(T--)
21     {
22         cin>>n>>s1>>e1>>a>>b>>c>>d;
23         l[1]=s1;
24         r[1]=e1;
25         minL=maxL=l[1];
26         minR=maxR=r[1];
27         for(int i=2; i<=n; i++)
28         {
29             l[i]=l[i-1]*a+b;
30             r[i]=r[i-1]*c+d;
31             if(l[i]>r[i])
32                 swap(l[i],r[i]);
33             if(r[i]<minR)///找出最大最小的两组,到时候直接跟这两组比较就好了
34             {
35                 minL=l[i];
36                 minR=r[i];
37             }
38             if(l[i]>maxL)
39             {
40                 maxL=l[i];
41                 maxR=r[i];
42             }
43         }
44         bool flag=false;
45         for(int i=1; i<=n; i++)
46         {
47             if(l[i]>minR&&r[i]<maxL)
48             {
49                 flag=true;
50                 break;
51             }
52         }
53         printf("%s\n",flag?"YES":"NO");
54     }
55     return 0;
56 }

时间: 2024-10-11 06:55:19

HDU2073(暴力) VS HDU5214(贪心)的相关文章

Codeforces 990E Post Lamps 【暴力】【贪心】

虽然只是10^6的数据量,但用cin会tle.一直知道cin常数大,但没想到会是10^3这个级别,而且比scanf慢5倍左右. 我们枚举每个power的lamp,然后对每个power用平均logn的代价去求它的cost,最后取最小值 对于每个power,我们从左往右地去照亮整个区间,首先0点要插一个路灯,下一个路灯理想上想插在0+power的位置(这样区间不被重复照亮),但实际上power位置上的路灯可能被blocked了,所以我们想在power位置之前的离power最近的一个位置安装路灯.如果

Google codejam Qualification Round 2015 B 巧妙枚举结果 + 贪心

背景:想了好久只想到用深搜的指数级别枚举办法来过了小数据,大数据自然超时,后来看了解题报告,才过. 思路:当前所有盘子中,煎饼个数最多的盘子里有n个煎饼,i 从 1 - n 枚举分裂之后的煎饼最多盘子里的个数,然后用贪心的方法计算要达到当前状态所需的最少分裂步数 k ,最后用时就是 i + k ,求出所有用时中最小的即可 感悟:这个题的精华之处是所有最终状态最多只有1000种,对于每种最终状态所需要的的步数又可以通过高效的贪心方法求出,思维很巧妙,算是暴力枚举和贪心的巧妙结合. 我的代码: #i

[luogu] P4364 [九省联考2018]IIIDX(贪心)

P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了. 这款音乐游戏内一般都包含了许多歌曲,歌曲越多,玩家越不易玩腻.同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲目公开,有些曲目你需要通关某首特定歌曲才会解锁,而且越晚解锁的曲目难度越高. 题目描述 这一天,Konano 接到了一个任务

算法学习 - 动态规划(DP问题)(C++)

这几天一直再看,觉得看懂了一些,先记下来. 动态规划 动态规划是运筹学的一个方向,就是把多级最优化问题分解成一系列的单阶问题.在不断增加的过程中,不断的计算当前问题的最优解. 一般分为如下四个部分: 线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等: 区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等: 树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等: 背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等: 汽车

JZOJ4316【NOIP2015模拟11.5】Isfind 题解

JZOJ4316 [NOIP2015模拟11.5]Isfind 题解 Description Input Output Sample Input 4 3    acbc    abc    cba    cc Sample Output Y    N    Y Data Constraint 思路: 题意要看懂,首先声明一下"子串"和"子序列"的区别,S的"子串"意思是在S中选取任意i个(0 < i <= |S|)连续字符组成的字符串

【模板】.bat对拍

对拍是个很有用的东西,比如在验证贪心策略是否正确时,可以写上个暴力然后和贪心程序对拍上几个小时. 在c++里用system写对拍总是会出现一些莫名其妙的问题.. 比如my.out明明是1 fc的时候却认为它是0 .bat文件对拍华丽丽地登场(一定要先打开生成数据的文件) :loop data.exe std.exe my.exe fc std.out my.out if %errorlevel%==0 goto loop pause 把这一段代码写到txt里,再把txt改成bat打开就好 原文地

异或最大值

1.1216: 异或最大值 http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1216 Time Limit: 2 Sec Memory Limit: 128 Mb Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数. Output 任意两数最大异或值 Sample Input 3 3 7 9 Sample

[考试反思]1010csp-s模拟测试65:突袭

博客园挂了,不让粘图. 写的朴素一点. #1:100+100+25=225 #2:100+70+35=205 #2:100+60+45=205(我) 回到第一机房还算不错的第一仗. 考完之后我以为我AK了然而T2被卡常打成暴力,T3贪心伪证了(虽说是全场最高分) 全程在思考.很好啊. 继续保持. 注意常数,在卡常题上要花些时间优化打法卡常. T1:Simple 做法比较傻逼. 互质下才好做,所以把nm都干掉gcd,把这样贡献的答案先算上. 我们考虑列出一个表,每n个一行(n<=m). 这样如果某

【uva 10570】Meeting with Aliens(算法效率--暴力+贪心)

题意:输入1~N的一个排列,每次可以交换2个整数,问使排列变成1~N的一个环状排列所需的虽少交换次数.(3≤N≤500) 解法:(又是一道我没打代码,光想和看就花了很久时间的题~QwQ)由于n很小,可以暴力枚举目标的环状排列,于是贪心交换——把元素 x 直接与它的目标位置上的元素互换,这样至少使1个元素的位置正确了.而若 x 先与其他 k 个元素交换,是最多能得到 k+1 个元素的正确排列的,这样并没有之前的策略优.    另外,网上关于此题还有一种关于对链状序列找环的说法,我更加不理解.若有人