1. 程式人生 > >洛谷 P1824 進擊的奶牛 題解

洛谷 P1824 進擊的奶牛 題解

style 題解 ace str 進行 pre 輸入輸出 c代碼 iostream

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接 :https://www.luogu.org/problem/show?pid=1824

題目描述

Farmer John建造了一個有N(2<=N<=100,000)個隔間的牛棚,這些隔間分布在一條直線上,坐標是x1,...,xN (0<=xi<=1,000,000,000)。

他的C(2<=C<=N)頭牛不滿於隔間的位置分布,它們為牛棚裏其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,Farmer John想把這些牛安置在指定的隔間,所有牛中相鄰兩頭的最近距離越大越好。那麽,這個最大的最近距離是多少呢?

輸入輸出格式

輸入格式:

第1行:兩個用空格隔開的數字N和C。

第2~N+1行:每行一個整數,表示每個隔間的坐標。

輸出格式:

輸出只有一行,即相鄰兩頭牛最大的最近距離。

輸入輸出樣例

輸入樣例#1:
5 3
1 
2 
8 
4 
9 
 
輸出樣例#1:
3


分析:
對最大的最近距離進行二分,判斷能否符合要求。
大概算是二分答案的裸題?

AC代碼:
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4
#include<iostream> 5 6 using namespace std; 7 int l = 21474836,r,n,c; 8 int num[100005]; 9 10 int cmp(int a,int b) 11 {return a < b;} 12 13 inline void read(int &x) 14 { 15 char ch = getchar(),c = ch;x = 0; 16 while(ch < 0 || ch > 9) c = ch,ch = getchar();
17 while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3)+ch-0,ch = getchar(); 18 if(c == -) x = -x; 19 } 20 21 bool jud(int x) 22 { 23 int cnt = 1,tmp = num[1]; 24 for(int i = 2;i <= n;++ i) 25 { 26 if(num[i] - tmp >= x) 27 cnt ++,tmp = num[i]; 28 if(cnt >= c) return true; 29 } 30 return false; 31 } 32 33 int main() 34 { 35 read(n),read(c); 36 for(int i = 1;i <= n;++ i) 37 { 38 read(num[i]); 39 if(num[i] > r) r = num[i]; 40 if(num[i] < l) l = num[i]; 41 } 42 sort(num+1,num+1+n,cmp); 43 while(l+1 < r) 44 { 45 int mid = ((l+r)>>1); 46 if(jud(mid)) l = mid; 47 else r = mid; 48 } 49 printf("%d\n",l); 50 return 0; 51 }

洛谷 P1824 進擊的奶牛 題解