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 }
________________________________________
Have a good life
---恢复内容结束---