二分答案關鍵有2點
1. 怎麼寫judge函式,其實就是根據題意想辦法判斷我們列舉的這個答案是否可行(合法)。
2.找到了乙個可行解(合法的,超過題目限制是不合法),再往左邊還是右邊查詢看是否有更優的解是個問題,需要好好想想。
(這兩點想明白了,二分就會異常簡單甚至比暴力列舉還要簡單。因為暴力列舉你還要考慮=0不移動時的特殊情況,而二分列舉就不用考慮特殊邊界等特殊情況,!所以推薦直接二分查詢列舉答案)
p2678跳石頭:
題意方面:最開始就是不知道它最小最大是什麼意思。。。
題目講的很繞,很煩,理清了後本質就是:求的是去掉幾個數,所有得可能的排列情況中最小距離,再取這些最小距離中最大的那乙個就是答案(最小值最大化)
一階段:想的是搜尋,找出所有剩n-m個數的排列(公升序不重複),求出最小值,再在這些最小值中取最大的。(這是最好想的也最暴力的方法,但嚴重超時!)
1 #include2 #include3 #include4using
namespace
std;
5const
int inf=0x7fffffff;6
int n,b,a[100001];7
int used[100001];8
int min=1e9,max=0;9
void so(int last,int
step)
1018 max=max(max,min);
19return;20
}2122int k=b-step;
23for(int i=last;i<=n;i++)
2429}30
31int
main()
二階段:看了某位大佬的一句話,「正向求出答案不好入手,求解答案遠遠沒有驗證答案簡單「!(重大啟發啊)
而且題目本來就是要求所有情況中最大的,本來就是暴力,就看你怎麼優化暴力了,只是現在僅僅想到驗證答案。就從頭到尾乙個乙個驗證答案是否符合,<=m次都是符合的選出乙個最大的就行,只要》m後面就肯定更大,所以可直接結束!可以發現這就是線性查詢(效率很低,所以有了後面的二分查詢優化!但理解暴力演算法也很重要),2000ms+過了。。
注意:暴力迴圈時1.像0,6這樣移動0次肯定要比移動1次更大啊(你都沒法取到1次,所以最終還是0);同理0,5,6移動1次肯定比移動2次甚至更多要優啊!(你都沒法取到2次,最大到l取1次而已,沒用完m)
2.就像上面情況,出題人專門給你個偏大的m,答案就是不用完m時才能取到,這時你只判斷==m時不就錯了嗎!
3.也就是說,題目一定存在這樣的點,4.關鍵特殊1
最終終於找到最後的bug了!很簡單嘛,他如果給你乙個故意偏大的m你肯定取不完,所以答案肯定就是1 2 3 4 5 6
取走4個點是最優的!如果給你m=5或6或更多!你就取不到!(因為迴圈答案最多從1到a[n]-a[1]即5!所以最多取到4)
5.關鍵特殊2
1 2 3 4
1,0次(發現並沒有m=1次時的情況!關鍵,你只找m==1的答案,結果沒有,所以就0輸出l錯,實際答案應該是1,移動1次最近距離還是1!)
2,2次
3,2次
總之,關鍵,你只直接判斷m次是有問題的,因為這個m次答案可能沒有,要麼比m多,要麼比m少,跳躍性的,像1次,這時候就只能往前走了!退一步答案小一點即(所以移動次數多距離大遞增性沒錯,但沒有你移動這個次數的答案你不得只能捨棄往前走了!!(所以啊,你想不到的東西不代表它不存在,只是你沒想到,想出來時是如此激動人心!(就是太花時間了,想了整整兩天~~)
1 #include 2 #include 3 #include 4using
namespace
std;
5const
int maxn=1e6+5;6
inta[maxn];
7int
l,n,m;89
int judge(int
x)10
1718
return
cnt;19}
2021
intmain()
2238
else
break;//
後面更大39}
4041 cout4243
return0;
4445 }
三階段:便是對暴力線性驗證的優化,二分查詢答案驗證。70ms過!
1 #include 2 #include3 #include 4 #include 5 #include 6
using
namespace
std;
7 typedef long
long
ll;8
const
int maxn=1e6+5;9
inta[maxn];
10int
l,n,m;
1112
int judge(int
x)13
2021
return
cnt;22}
2324
intmain()
25//
t<=m次就是可行解,擴大範圍試試還有沒有更大解41}
4243 cout4445
return0;
46 }
完。
洛谷1182 1336 二分答案技巧
題目傳送門 今天真是令人悲傷的一天,寫什麼都寫不出來,本來想找點st表的題做,在找題的路上意外看到了網路流,想到自己網路流完全不行就想研究這個,為了研究網路流,我想先去研究我同樣薄弱的bfs,於是又遇到了我的一生之敵八數碼,想把八數碼解決就先練一下字串雜湊,結果就是直到現在,一事無成,只能說如下圖 ...
洛谷1873砍樹 二分答案
伐木工人公尺爾科需要砍倒m公尺長的木材。這是乙個對公尺爾科來說很容易的工作,因為他有乙個漂亮的新伐木機,可以像野火一樣砍倒森林。不過,公尺爾科只被允許砍倒單行樹木。公尺爾科的伐木機工作過程如下 公尺爾科設定乙個高度引數h 公尺 伐木機公升起乙個巨大的鋸片到高度h,並鋸掉所有的樹比h高的部分 當然,樹...
洛谷1577 1297切繩子(二分答案)
wonderland居民決定舉行一屆地區性程式設計大賽。仲裁委員會志願負責這次賽事並且保證會組織一次有史以來最公正的比賽。為此,所有參賽者的電腦和網路中心會以星狀網路連線,也就是說,對每個參賽者,組委會會用一根長度一定的網線將他的計算機與中心連線,使得他們到網路中心的距離相等。為了買網線,組委會與當...