二分和三分 憤怒的牛

2021-09-11 12:37:08 字數 1492 閱讀 3372

為了彌補自己的二分太渣,從二分的水題做起,從我做起~

題目描述

農夫約翰建造了一座有n間牛舍的小屋,牛舍排在一條直線上,第i間牛舍在xi的位置,但是約翰的m頭牛對小屋很不滿意,因此經常互相攻擊。約翰為了防止牛之間互相傷害,因此決定把每頭牛都放在離其它牛盡可能遠的牛舍。也就是要最大化最近的兩頭牛之間的距離。

牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間裡,它們就要發生爭鬥。為了不讓牛互相傷害。john決定自己給牛分配隔間,使任意兩頭牛之間的最小距離盡可能的大,那麼,這個最大的最小距離是多少呢?

輸入第一行用空格分隔的兩個整數n和m;

第二行為n個用空格隔開的整數,表示位置xi。

輸出輸出僅乙個整數,表示最大的最小距離值。

複製樣例資料

5 3

1 2 8 4 9

樣例輸出

3
提示

把牛放在1,4,8這樣最小距離是3

2≤n≤105 , 0≤xi≤109, 2≤m≤n

之前做過乙個題目與之類似:是跳石頭這裡鏈結

方法都一樣我們每次列舉乙個x判斷它為 最小距離是否可行,如果可行我們保留到乙個集合裡,然後選出最大的可行值就是答案,不可行直接跳過,這種方法絕對可以篩選是沒有問題的,答案也絕對是對的,但是複雜度太高 (穩tle),所以還是二分,以後碰見最大最小值,最小最大值基本都是二分。

這裡需要注意幾個細節:

1.資料的範圍:1e9出現警告 long long 安排上。

2.可行條件是,在這個距離下可以安放m頭牛及包括m,但是第一頭已經安排上了,所以條件為 tot>=2,tot為計數器。

然後**附上:

#include #include #include #include #include #include #include #include #include #define min(x,y) ((x)<(y)?(x) : (y))

#define max(x,y) ((x)>(y)?(x) : (y))

#define rl(a) scanf("%d",&a);

#include using namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int mod=10007;

const int inf=1e9;

const int maxn=1e6+5;

ll a[maxn];

int n,m;

bool judge(int x)

}if(tot>=m) return true;//我們在判斷時,已經假設第一頭已經放了。

return false;

}int main()

else

r=mid-1;

}printf("%lld\n",ans);

return 0;

}

憤怒的牛 二分

題目描述 農夫約翰建造了一座有n間牛舍的小屋,牛舍排在一條直線上,第i間牛舍在xi的位置,但是約翰的m頭牛對小屋很不滿意,因此經常互相攻擊。約翰為了防止牛之間互相傷害,因此決定把每頭牛都放在離其它牛盡可能遠的牛舍。也就是要最大化最近的兩頭牛之間的距離。牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間裡,...

二分和三分

三分二分,乙個簡單而神奇的演算法,可以簡化時間複雜度,但是用二分有乙個條件,就是我們進行二分的序列必須有單調性。原理 aa中找乙個數x xx 保證x xx一定存在 我們可以用樸素演算法,直接從頭到尾找一遍,時間複雜度o n o n o n 如果當序列a aa的長度十分大時,這種方法就不好用了。二分橫...

二分和三分

二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...