【刷水-二分答案】BZOJ1650-[Usaco2006 Dec]River Hopscotch 跳石子

【题目大意】

数轴上有n个石子,第i个石头的坐标为Di,现在要从0跳到L,每次条都从一个石子跳到相邻的下一个石子。现在FJ允许你移走M个石子,问移走这M个石子后,相邻两个石子距离的最小值的最大值是多少。

*0和L也是两块石头!

【思路】

二分最小值检验即可。二分都是套路,然而我写错了,烧 杯 把ub敲成了l,忘记了范围其实是[lb,ub)QAQ

检验部分的套路:last记录上一次跳到的石头,只要当前石头和上一次的石头的距离小于dis,那么就移走这块石头。如果移走的石头>m,就说明不可行。这是目前看来最简洁的写法了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int MAXN=50000+50;
 7 int l,n,m,d[MAXN];
 8
 9 int check(int dis)
10 /*这种检验方式在贪心中经常使用*/
11 {
12     int last=0,tmp=0;
13     for (int i=1;i<=n;i++)
14     {
15         if (d[i]-d[last]<dis)
16         {
17             tmp++;
18             if (tmp>m) return 0;
19         }
20         else last=i;
21     }
22     return 1;
23 }
24
25 void init()
26 {
27     scanf("%d%d%d",&l,&n,&m);
28     for (int i=1;i<=n;i++) scanf("%d",&d[i]);
29     sort(d+1,d+n+1);
30     d[0]=0;
31     d[++n]=l;
32 }
33
34 void bisearch()
35 {
36     int lb=0,ub=l+1;
37     while (lb+1<ub)
38     {
39         int mid=(lb+ub)>>1;
40         if (check(mid)) lb=mid;
41             else ub=mid;
42     }
43     printf("%d",lb);
44 }
45
46 int main()
47 {
48     init();
49     bisearch();
50     return 0;
51 }
时间: 2024-10-05 04:58:49

【刷水-二分答案】BZOJ1650-[Usaco2006 Dec]River Hopscotch 跳石子的相关文章

bzoj1650[Usaco2006 Dec]River Hopscotch 跳石子*

bzoj1650[Usaco2006 Dec]River Hopscotch 跳石子 题意: 数轴上有n个石子,第i个石头的坐标为Di,现在要从0跳到L,每次跳都从一个石子跳到相邻的下一个石子.现在问移走这M个石子后,相邻两个石子及0到最前一个石子及最后一个石子到L距离的最小值的最大值是多少.n≤50000 题解: 为什么有NOIP2015即视感~二分距离最小值,然后如果当前石子和上一个石子相差小于二分值就将这个石子移走,如果位置L与上一个石子相差小于二分值,此时若还没有移满M个且有没移走的石子

1650: [Usaco2006 Dec]River Hopscotch 跳石子

题目:数轴上有n个石子,第i个石头的坐标为Di,现在要从0跳到L,每次条都从一个石子跳到相邻的下一个石子.现在FJ允许你移走M个石子,问移走这M个石子后,相邻两个石子距离的最小值的最大值是多少. 输入:25 5 2(l m n) 2(d[i]) 14 11 21 17 输出:4 解析:二分枚举两个石头间的最小值x,如果有哪两块石头之间的距离小于x,就删除后面这块石头.做完后,如果删除的石头数量小于等于限定数量,则成立,否则,不成立. #include<iostream> #include<

bzoj1650:跳石子

1650: [Usaco2006 Dec]River Hopscotch 跳石子 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 345  Solved: 230[Submit][Status][Discuss] Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping f

BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; const int maxn = 20009; struct HASH { int id[maxn], N; HASH() { N = 0; } inline void work() { sort(id, id + N); N

[bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式_后缀数组_二分答案

Milk Patterns 产奶的模式 bzoj-1717 Usaco-2006 Dec 题目大意:给定一个字符串,求最长的至少出现了$k$次的子串长度. 注释:$1\le n\le 2\cdot 10^4$,$2\le k\le n$. 想法:不难想到二分答案,现在我们考虑如何验证. 这里就是后缀数组的一个妙用了. 我们对原串建立后缀数组,观察$ht$数组. 考虑当前二分出来的$mid$.如果有至少连续$k$的$ht$值都不小于$mid$,那么$k$就是合法的. 故此我们直接扫$ht$数组看看

BZOJ 4590: [Shoi2015]自动刷题机 二分答案

4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1056  Solved: 380[Submit][Status][Discuss] Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写程序,每秒,自动刷题机的代码生成模 块会有两种可能的结果: A.写了x行代

POJ 3258 River Hopscotch 二分答案

River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6193   Accepted: 2685 Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. T

[BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1297  Solved: 705 [Submit][Status][Discuss] Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". John的牛奶按质量可以被赋予一个0到100

【SPFA+二分答案】BZOJ1614- [Usaco2007 Jan]Telephone Lines架设电话线

沉迷于刷水 以前的那个二分写法过不了QAQ 换了一种好像大家都比较常用的二分.原因还不是很清楚. [题目大意] 给出一张图,可以将其中k条边的边权减为0,求1到n的路径中最长边的最小值. [思路] 二分答案,即最长边的最小值x.对于每次check(x),我们将边权大于x的边设为1,边权小于等于x的边设为0,跑SPFA,结果相当于最少经过多少条边权大于x的边.如果SPFA结果>k,则不可行,否则可行. 1 #include<iostream> 2 #include<cstdio>