1. 程式人生 > >3258 River Hopscotch(二分法求最大化最小間隔)

3258 River Hopscotch(二分法求最大化最小間隔)

Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement takes place on a long, straight river with a rock at the start and another rock at the end, L units away from the start (1 ≤ L ≤ 1,000,000,000). Along the river between the starting and ending rocks, N (0 ≤ N ≤ 50,000) more rocks appear, each at an integral distance Di from the start (0 < Di < L).

To play the game, each cow in turn starts at the starting rock and tries to reach the finish at the ending rock, jumping only from rock to rock. Of course, less agile cows never make it to the final rock, ending up instead in the river.

Farmer John is proud of his cows and watches this event each year. But as time goes by, he tires of watching the timid cows of the other farmers limp across the short distances between rocks placed too closely together. He plans to remove several rocks in order to increase the shortest distance a cow will have to jump to reach the end. He knows he cannot remove the starting and ending rocks, but he calculates that he has enough resources to remove up to M rocks (0 ≤ M ≤ N).

FJ wants to know exactly how much he can increase the shortest distance before he starts removing the rocks. Help Farmer John determine the greatest possible shortest distance a cow has to jump after removing the optimal set of M rocks.

Input
Line 1: Three space-separated integers: L, N, and M
Lines 2.. N+1: Each line contains a single integer indicating how far some rock is away from the starting rock. No two rocks share the same position.
Output
Line 1: A single integer that is the maximum of the shortest distance a cow has to jump after removing M rocks
Sample Input
25 5 2
2
14
11
21
17
Sample Output
4
Hint
Before removing any rocks, the shortest jump was a jump of 2 from 0 (the start) to 2. After removing the rocks at 2 and 14, the shortest required jump is a jump of 4 (from 17 to 21 or from 21 to 25).

題意:在一個寬L的河上,有N個石頭,現在牛要踩這些石頭跳到對岸,給出每個石頭的座標,問,去掉M個石頭後,剩下的石頭兩兩之間的距離最小值,最大能是多少。

對於最大化最小值問題,我們可以用二分解決。首先要求的是最小間隔的值,那麼就二分距離來得到符合條件的最小間隔。首先我們確定一個概念:落腳點。我們有N個石頭,從中去掉M個,那麼有N-M個石頭是留下的,這N-M個石頭,是牛渡河必須踩到的石頭,對於這些石頭,我們要保證符合的條件是必須都大於或等於最終求得的結果,間隔最小值。

明白了這個概念,就可以得到二分的條件。首先,我們取一個左邊界0到右邊界河寬,這一段二分的範圍,從中取得一箇中值,這個中值即我們設的結果,現在要做的是判斷該結果是否符合題目要求的條件。

首先起點是肯定要走的,也就是0的座標位置,從該點出發,跳向第一個石頭,計算第一個石頭和第一個落腳點之間的距離,若小於二分得到的最小值,說明在設定的這個最小值情況下,我們正在遍歷的這塊石頭是沒有用的,因為其在的位置,使我們設的最小值變小了,我們已經明確一個最小值,那麼不應該有任何一個間距小於這個最小值,因此,一旦出現小於最小值的間距,說明某個石頭是不應該存在的,是應該被刪掉的。此時記錄一個cnt表示該最小值下被刪除的石頭個數。當我們遍歷到一個石頭,發現其離落腳點的距離大於等於最小值時,說明該石頭應該被保留,保留的石頭我們要踩上去,因此出現這樣的石頭時,我們更新落腳點,拿新的落腳點再去衡量後面的石頭,與新落腳點的距離是否符合大於等於最小值的條件。

最後遍歷玩所有石頭,會得到該間距下被刪除的石頭個數,用於比較題目給出的M個石頭。若cnt大於M,說明石頭被刪多了,那麼這個所謂的最小間距,其實是偏大了的,它使得一些不該被刪掉的石頭也刪掉了,因為這個過大的間距,一些石頭被包含其中。因此,我們要作出的調整是向較小的方向二分尋找正確答案。

這就是二分的判斷條件,即石頭被刪個數的比較。

若cnt小於M,說明該所謂的最小間隔太小了,一些石頭本該被刪掉,因為其位置分割了一些間距 。一些石頭可以被拿掉卻仍在阻礙我們擴大最小間距。因此此時向較大值方向二分查詢正確答案。

若cnt等於M,我們同樣應增大查詢範圍,因為這種情況,雖然刪掉的石頭夠數了,但是具體刪掉哪些石頭呢?我們如果再加大最小間距,那麼就是在相同刪除石頭的數量下,儘量刪去排列較為密集的石頭,以達到消滅過小的間距的目的。

這樣以落腳點的方式,不斷篩選石頭,用間隔淘汰石頭,用淘汰石頭的數量判斷間隔,得以二分出最大化的最小間隔

#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=5e4+10;
int n,l,m,a[maxn];
bool judge(int mid)
{
    int start=0;
    int cnt=0;
    for(int i=0;i<n;i++)
        if(a[i]-start<mid)cnt++;
        else start=a[i];///理論上還應判斷終點與最後一個落腳點的距離要大於最小值,但是題目並沒有卡這個問題
    if(cnt>m)return false;
    return true;
}
int main()
{
    while(scanf("%d%d%d",&l,&n,&m)!=EOF)
    {
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        sort(a,a+n);
        int ll=0,rr=l,ans=0;
        while(ll<=rr)
        {
            int mid=(ll+rr)>>1;
            if(judge(mid))
            {
                ll=mid+1;
                ans=mid;
            }
            else rr=mid-1;
        }
        printf("%d\n",ans);
    }
}

相關推薦

3258 River Hopscotch(二分最大化間隔)

Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a

POJ3258 River Hopscotch二分最大化值)

Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement t

POJ 3273 二分最大化

Monthly Expense Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 20086 Accepted: 7916 Description Farmer

POJ 3258 River Hopscotch(二分答案)

-c cannot ant class clu separate 最大 calculate ble River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submiss

POJ T2456 Aggressive cows(二分搜尋:最大化值)

題解:   可以套用二分搜尋求解最優解的模型(這個部落格)   題意是有N個牛舍,C頭牛,給出的牛舍位置並不按順序。因為牛之間會打架,所以要求兩兩牛之間能隔開的最大距離。(一頭牛一個牛舍)。

POJ 2456 Aggressive cows(二分搜尋,最大化值)

Aggressive cows Time Limit:1000MS Memory Limit:65536K Total Submissions:9062 Accepted:4504

梯度下降函式值 基於matlab實現

演算法原理 梯度下降法是一個最優化演算法,可以用來求一個函式的最小值,最大值等,也常用於人工神經網路中更新各個感知器之間的權值,求出cost function的最小值等,應用廣泛。 其原理簡單,就求函式的最小值這個應用而言,大致說來就是先求出該函式梯度,大家

hihocoder 二分·二分答案【二分搜尋,最大化值】 (bfs)

題目 這道題做了幾個小時了都沒有做出來,首先是題意搞了半天都沒有弄懂,難道真的是因為我不打遊戲所以連題都讀不懂了? 反正今天是弄不懂了,過幾天再來看看。。。 題意:一個人從1點出發到T點去打boss,這個人有兩個屬性值,防禦值和戰鬥值,這兩個值成反比,為了打贏boss我

POJ - 3258 River Hopscotch二分--最大化值】

題目傳送門 題目描述:第一行輸入三個整數L,N,K,表示一個長度為L的河上有N塊石頭,任意移去K塊,問任意兩塊石頭之間的最小間隔是多少(包括起始點到第一塊石頭的間隔和最後一塊石頭到終點的間隔),接下來N行是N塊石頭距離起始點的位置。 解題思路:這是一道典型的利用二分最大化最小值的題。現在

3258 River Hopscotch二分--最大化值】

題目傳送門 題目描述:第一行輸入三個整數L,N,K,表示一個長度為L的河上有N塊石頭,任意移去K塊,問任意兩塊石頭之間的最小間隔是多少(包括起始點到第一塊石頭的間隔和最後一塊石頭到終點的間隔),接下來

POJ 3258 River Hopscotch (距離)【二分

poj ont str () scanf esp https ast clas <題目鏈接> 題目大意:現在有起點和終點兩個石塊,這兩個石塊之間有N個石塊,現在對這N個石塊移除M個石塊,使得這些石塊之間的最短距離最大,註意,起點和終點這兩個石塊不能被移除。 解題

二分大值化或最大化問題

1.最小值最大化 例題: 題目描述    農夫約翰建造了一座有n(2<=n<=100000)間牛舍的小屋,牛舍排在一條直線上,第i間牛舍在xi(0<=xi<=1000000000)的位置,但是約翰的m(2<=m<=n)頭牛對小屋很不滿

POJ 3258 River Hopscotch最大化值)

Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement t

二分值(HDU2899)

題目連結。題目就是給出一個關於x的多項式,其中y是引數,給定任意的y求出這個多項式的最小值。我們首先觀察y的範圍就可以知道,x一定是在[0,100]之間的數字,求這個多項式的最小值,當然是當這個多項式對應的函式的導函式的等於零的時候最可以取得最值(當然這句話是很不嚴謹的,導函

二分單峰函式大值

#include <iostream> #include <boost/timer/timer.hpp> #include <ctime> #include <set> using namespace boost::timer

【POJ】3258 River Hopscotch 不僅僅是二分

River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12303 Accepted: 5271 Description Every year th

River Hopscotch最大化值)

每年,奶牛都會舉辦一場特別版的跳房子活動,其中包括在河中小心翼翼地從岩石跳到岩石。興奮發生在一條長而直的河流上,開始時有一塊岩石,最後有另一塊岩石,距離開始L單位(1≤L≤1,000,000,000)。沿著起始岩石和結束岩石之間的河流,出現N(0≤N≤50,000)更多的岩

uva 714 Copying Books(二分大值化)

題目大意:將一個個數為n的序列分割成m份,要求這m份中的每份中值(該份中的元素和)最大值最小, 輸出切割方式,有多種情況輸出使得越前面越小的情況。 解題思路:二分法求解f(x), f(x) &l

POJ 3258 River Hopscotch(牛過河問題,二分

Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement t

POJ 3258 -- River Hopscotch

ret idt pst imp ext namespace mine arch math River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Subm