P2678 跳石头

2019 - 4 - 17


这道题使我们的市内竞赛的题

 

然则我们都不会

 

现在明白了


这道题的本质就是暴力,二分完了还是暴力,只是二分降低了暴力的次数


让我们开始吧

平坦的成功之路?那只是先驱者踏平的 


——————————————————————

难度:普及+/提高-

链接:Miku最好看

——————————————————————

这个题就是一个二分,暴力,思路?很抱歉,我证不出来,

你能明白的

——————————————————————

2019/4/17

哦,对,为什么是l+r+1    /2 呢?

 

________________________________________

 1 /*
 2 这道题就是二分
 3 
 4 首先,你要找到暴力做法,找到之后,你就会发现这道题的做法了——二分
 5 
 6 
 7 当然,二分的关键,就是区间,关于这个区间,就是距离,我们从一半一半开始二分距离 
 8 
 9 
10 以及,看到二分的关键,你会发现 如果这个mid是合法的,那么答案就在mid—r之间,否则,就在l-mid之间
11 
12 如果大佬您能证明出来,请留在评论区,谢谢 
13 
14 
15 */
16 #include<iostream>
17 
18 using namespace std;
19 int stone[50001];//距离记录石头 
20 
21 int L,N,M;
22 
23 int check(int x)//这里是暴力检查 
24 {
25     int last=0,cnt=0; //上一个点,我们需要移走的石头数 
26     for(int i=1;i<=N+1;++i){//n+1?因为 到终点还有一段路程 
27         if(stone[i]-last<x) cnt++;//如果留着这块石头 就会发现最短路径小于我们的mid,就要删去它
28         
29         //删去了,就不用更新last ,因为石头已经不存在了 
30         else
31         last=stone[i];//留着,更新last 
32     }
33     if(cnt>M) return 0;//我们为了满足条件 需要拿走超过规定的石头,自然是不合法 
34     else return 1; //你明白的 
35 }
36 
37 
38 int main()
39 {
40     cin>>L>>N>>M;
41     for(int i=1;i<=N;++i)
42     {
43         cin>>stone[i];//输入石头位置 
44     }
45     stone[N+1]=L;//处理到终点的路程 
46     int l=1,r=L;
47     while(l<r)//这是二分 
48     {
49         int mid=(l+r+1)/2; 
50         if(check(mid)) l=mid;//看不懂if 
51         //如果您能证明,可不可以留下过程呢 
52         
53         
54         //感性理解 --slk 
55         else
56         r=mid-1;
57     }
58     cout<<l;//输出左区间 
59     return 0; 
60 }
AC

________________________________________

Have a good life

---恢复内容结束---

原文地址:https://www.cnblogs.com/For-Miku/p/10698374.html