CodeForces - 589A(二分+贪心)

题目链接http://codeforces.com/problemset/problem/589/F

题目大意:一位美食家进入宴会厅,厨师为客人提供了n道菜。美食家知道时间表:每个菜肴都将供应。

对于第i道菜肴,他知道时间ai和bi的两个整数时刻(从宴会开始的几秒钟内) - ai为该菜端出来的时间,bi为该菜端走的时间(ai <BI)。例如,如果ai = 10且bi = 11,那么第i个菜肴可在一秒钟内进食。


菜肴数量非常大,所以只要菜肴可以吃(即,在大厅里),它就无法用完。

美食家想要尝试每道菜,不要冒犯任何厨师。因此,美食家想要在相同的时间内吃每道菜。在吃饭期间,美食可以在菜肴之间立即切换。仅在整数时刻允许在菜肴之间切换。

美食家希望在宴会上尽可能长时间吃饭而不违反上述任何条件。你能帮助他,并找出他在宴会上吃的最长时间吗?

输入
第一行输入包含一个整数n(1≤n≤100) - 宴会上的菜肴数量。

以下n行包含有关菜肴可用性的信息。第i行包含两个整数ai和bi(0≤ai<bi≤10000) - 第i个菜肴可用于进食以及第i个菜肴从大厅被带走时的时刻。
产量
输出应该包含唯一的整数 - 美食家可以在宴会上吃的最大总时间。

美食可以在菜肴之间即时切换,但只能在整个时间点切换。在吃完任何其他菜肴后,它可以返回菜肴。此外,在每个时刻,他都可以吃不超过一道菜。

例:

输入:

3
2 4
1 5
6 9

输出

6

解题思路:这个题目有点像区间调度问题,都是按结束时间最早的来排。被拿走时间最早的菜是最需要先吃的,因为先吃收盘早的菜对后面的菜影响就小。若收盘时间相同,那就按上菜时间来排,先吃上菜早的。然后我们就二分吃菜的时间,判断是否每道菜都可以吃达到该时间。

然后剩下的问题就是怎么判断每道菜吃的时间都可以达到t了,就是直接遍历每道菜的开始时间到结尾时间,定义一个vis数组,在x秒吃了该菜则把vis[x]标为1,下次该时刻就不吃其他的菜了。

附上代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,ans,vis[10005];
 7 struct node{
 8     int a,b;
 9     bool operator<(const node &x)const
10     {
11         if(b!=x.b) return b<x.b;  //按收盘时间从早到晚排
12         return a<x.a;
13     }
14 }st[105];
15 bool judge(int t)
16 {
17     memset(vis,0,sizeof(vis));
18     for(int i=0;i<n;i++)
19     {
20         int cnt=0;  //记录第i到菜吃的时间
21         for(int j=st[i].a;j<st[i].b;j++)
22         {
23             if(!vis[j])
24             {
25                 vis[j]=1; //j秒时吃了第i到菜
26                 cnt++;
27                 if(cnt==t) break;
28             }
29         }
30         if(cnt<t) return false;  //第i到菜不能达到时间t,
31     }
32     return true;
33 }
34 void binary_search()
35 {
36     int low=0,high=10000;
37     while(low<=high)
38     {
39         int mid=(low+high)/2;
40         if(judge(mid))
41         {
42             ans=mid;
43             low=mid+1;
44         }
45         else
46             high=mid-1;
47     }
48     return;
49 }
50 int main()
51 {
52     while(scanf("%d",&n)!=EOF)
53     {
54         ans=0;
55         for(int i=0;i<n;i++)
56             scanf("%d%d",&st[i].a,&st[i].b);
57         sort(st,st+n);
58         binary_search();
59         printf("%d\n",ans*n);
60     }
61     return 0;
62 }

原文地址:https://www.cnblogs.com/zjl192628928/p/9407987.html

时间: 2024-11-06 09:42:43

CodeForces - 589A(二分+贪心)的相关文章

Codeforces 825D 二分贪心

题意:给一个 s 串和 t 串, s 串中有若干问号,问如何填充问号使得 s 串中字母可以组成最多的 t 串.输出填充后的 s 串. 思路:想了下感觉直接怼有点麻烦,要分情况:先处理已经可以组成 t 串的部分,然后处理 s 串中可以利用的部分,如果还有问号剩余,再直接怼.但如果用二分写就很直观了,直接看最多能组成多少个 t 串. 居然踩了long long的坑感觉自己宛若一个zz.check函数中的计算要用long long防止溢出= =(明明大水题的说. #include<iostream>

Codeforces 830A. Office Keys (背包dp+贪心) / (二分+贪心)

题目链接: http://codeforces.com/problemset/problem/830/A 题意: n个人,k个钥匙(n<=k),p表示这些人要到达的位置 给出n个人的位置以及钥匙的位置,问花时间最多的那个人用时最少是多少?? 思路: 二分+贪心: 二分最少时间,需要对a,b位置数组排序,我们check函数只需要从左到右一个一个找过去,因为如果选后边的点,可能会使结果更差,假如当前这个人选后面的点,那可能会选中后面的人可以选的唯一的钥匙,不会使解更优. check(40)的时候答案

二分+贪心

上海邀请赛热身时候,C题是一个二分+贪心的题目.起初并不会,问了旁边的复旦大神.这几天无意发现VJ上一个专题.擦原来是一个经典类型. 二分+贪心 这类题目注意数据范围,1e8,1e9一般都是这样. 注意事项 二分法有很多写法,推荐用lf+1 < rf的写法.这个也符合计算机中数据存取的原则.对于浮点数,直接就循环100次,精度绝对够. 一般有两种类型,一种是询问最优,即数列中无重复.一种是多个即lower_bound ,upper_bound这类函数问题. 贪心使用,就是这个问题枚举答案可被验证

nyoj586||poj2456 二分+贪心

完全看不懂题意....百度搜搜才看懂题意  然后就参考代码了 和yougth的最大化()nyoj914差不多的方法 二分+贪心 #include <stdio.h> #include <algorithm> using namespace std; int c,a[100005],n; bool judge(int k) { int p=a[0],cnt=1;//也就这里注意点 从1开始 自己想想为啥 for(int i=1;i<n;i++) { if(a[i]-p>=

HDU 4004 The Frog&#39;s Games 二分 贪心

戳这里:HDU 4004 //思路:二分经典入门题...贪心判方案是否可行 1 #include "bits/stdc++.h" 2 using namespace std; 3 int L, n, m; 4 int pos[500010], dis[500010]; 5 6 bool Cant(int Dis_Jump) 7 { 8 int i, Dis_Sum = 0, Count = 0; 9 for(i = 1; i <= n + 1; ++i) { 10 if(dis[

贪心(bnuoj49103+二分+贪心)

贪心 小明喜欢养小鸡,小鸡喜欢吃小米.小明很贪心,希望养s只不同种类的小鸡,小鸡也很贪心,每天除了吃固定的ai粒小米外,还想多吃bi*s粒小米. 小明每天有M(0<=M<=10^9)粒小米可以喂小鸡,小鸡共有N(0<=N<=1000)种.问小明最多可以养多少只小鸡? Input 多组数据,请读到文件尾 第一行,整数N,M,以空格分隔,之后两行,第一行为N个整数ai,第二行为N个整数bi. ai.bi都在int范围内 Output 一行一个整数,s. Sample Input 2 4

poj1505Copying Books 二分+贪心详细总结

前两天花了时间理解了nyoj的586疯牛和nyoj619青蛙过河,满以为自己能重新写出这道题...谁知道..... 题意:有m本书,k个人来抄,每本书有一个书本页数:求使得k个人抄完的最大页数最小,并且每个人都至少要抄一本,然后输出抄书的方案 分析: 这里又涉及到前面nyoj的586疯牛和nyoj619青蛙过河说过的最大值中的最小值,  用前面的例子去理解比较方便 1.我们应该先用二分+贪心算出一个最大页数的最小值--这里和前面的类似 在二分的过程中,我们对于当前考虑的值 x  划分人数的贪心过

【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径.简单的说来, 这些点的布局就是一棵树,且每条边等长,都为1. 对于给定的一个奶牛路径集合,精明的奶牛们会计算出任意点对路径的最大值, 我们称之为这个路径集合的直径.如果直径太大,奶牛们就会拒绝锻炼. Farmer John把每个点标记为1..V (2 <= V <= 100,000).为了获得更加

poj1064 cable master(最大值问题:二分+贪心)

题意: 有n条电缆,他们的长度分别为l[i].如果从n条电缆中切割出K条长度相同的电缆的话,这k条电缆每条最长能多长?答案小数点后保留两位有效数字. 输入: n, k n行:l[i] Sample Input 4 11 8.02 7.43 4.57 5.39 Sample Output 2.00 数据范围: 1<=N<=10000; 1<=k<=10000; 1<=l[i]<=100000. 分析: 设命题:can(x)=能切割出k条长度为x的电缆. 问题转化:求can

HLG 1039 修路 (二分+贪心)

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1039 Description 前段时间,某省发生干旱,B山区的居民缺乏生活用水,现在需要从A城市修一条通往B山区的路.假设有A城市通往B山区的路由m条连续的路段组成,现在将这m条路段承包给n个工程队(n ≤ m ≤ 300).为了修路的便利,每个工程队只能分配到连续的若干条路段(当然也可能只分配到一条路段或未分配到路段).假设每个工程队