1433 例題1 憤怒的牛

2022-04-12 03:58:11 字數 1987 閱讀 7726

題解

this is an er'fen ti.

由題意可得  它是求最小值最大的問題

我們假設:

每兩頭牛之間的最小距離為 d ,也就是每兩頭牛之間的距離 >= d ,問題也就是求這個 d 最大是多少

理一理思路

1.對所有的牛舍從小到大排序

2.假設我們把第 i 頭牛放在 ai 號牛舍裡,那麼第 i+1 頭牛就要放在 ai+d<=ak 的ak 牛舍中,由於可能有很多牛舍滿足條件,我們選取距離 ai 最近的乙個(這是很顯然的,因為這樣對後面的選擇影響小),然後依次類推,放牛,  放牛,放牛。。。

ps:舉個栗子解釋一下為什麼顯然:

假設john有3頭奶牛要放,他有10個牛舍,那麼我們應該怎麼安排呢???

我們先假設答案d等於多少,然後再不斷調整答案,得到最終結果

下面看圖

按照思路,我們應該把cow2放在4號,但是我們就不,我們看看會有什麼後果

好啦,顯然,我們應該按照思路走:選取距離 ai 最近的乙個

3.由於只需要在開頭對陣列進行一次sort排序,後面每次判斷對每頭牛只需要進行一次處理,時間複雜度為o(nlogn)

(注釋在**後面o)

**

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=1e5+1

;int

n,c;

inta[maxn];

bool check(int

d) //注釋5

return cow>=c;

}int

main()

printf("%d

",r);

return0;

}

注釋1.輸入資料,然後排序一下牛舍

2.初始化一下 l 為0,r 其實就是最後的結果,初始化為第乙個牛舍與最後乙個牛舍的距離

3.mid為暫定的那個最小距離(也就是部落格開始的那個 d ),二分常規操作,(l+r)÷2

4.拿著mid去函式check裡看一看(建議結合一下注釋5看check的用法)

(1)最小距離定為這個mid,cow可以放下的數目》=規定數目,那麼說明這個mid可以再大一點, 更新 l 

(2)最小距離定位這個mid,牛舍不能放下約翰的牛嘍,那就說明這個距離就要縮小一點啦,更新 r 

5.自定義check函式

(1)我們放了第乙個cow

(2)下乙個cow就要放到》=

的牛舍裡距離上乙個cow最近的牛舍中了

(3)for迴圈,計算可以放入cow的數目

(4)返回的數值用於注釋4

6.不斷二分啊二分啊,l 就無限逼近  r ,最後就得到答案啦

1448 例題1 電路維修

樣例樣例輸入 樣例輸出 3 5 1 題解我們可以把電路板上的每個格點 橫線與豎線的交叉點 看作無向圖中的結點。若兩個結點x和y是某個小方格的兩個對角,則在x與y之間連邊。若該方格中的標準件 對角線 與x到y的線段重合,則邊權為0 若垂直相交,則邊權為1 說明需要旋轉1次才能連通 然後,我們在這個無向...

1465 例題1 剪花布條

1465 例題1 剪花布條 時間限制 1000 ms 記憶體限制 65536 kb 提交數 1124 通過數 727 題目描述 原題來自 hdu 2087 一塊花布條,裡面有些圖案,另有一塊直接可用的小飾條,裡面也有一些圖案。對於給定的花布條和小飾條,計算一下能從花布條中盡可能剪出幾塊小飾條來呢?輸...

1440 例題1 數的劃分 dfs剪枝

1440 例題1 數的劃分 時間限制 1000 ms 記憶體限制 65536 kb 提交數 1607 通過數 1059 題目描述 將整數n分成k份,且每份不能為空,任意兩份不能相同 不考慮順序 例如 n 7,k 3,下面三種分法被認為是相同的。問有多少種不同的分法。輸出乙個整數,即不同的分法。輸入 ...