糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 2456 Aggressive cows 二分

思路:

首先对所有位置排序一下。
可能的最大的 distance 为 (range_right - range_left) / (C - 1)。
所以二分答案的时候区间的右边就是这个了。
判断某个 distance 是否能够成立的过程很简单:
只需要从左往右放牛,如果放到最后一个点都放不完,就不成立了。

代码 140ms:
#include <stdio.h>
#include 
<stdlib.h>

int N, C, in[100032];

int cmp(const void *a, const void *b)
{
    
return *(int *)a - *(int *)b;
}


__inline 
int can(int val)
{
    
int i, pos, sum;

    pos 
= 1;
    
for (i = 1; i < C; i++{
        sum 
= 0;
        
while (pos < N && sum < val) {
            sum 
+= in[pos] - in[pos - 1];
            pos
++;
        }

        
if (sum < val)
            
return 0;
    }

    
return 1;
}


int main()
{
    
int i, l, r, m;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d%d"&N, &C);
    
for (i = 0; i < N; i++)
        scanf(
"%d"&in[i]);
    qsort(
in, N, sizeof(in[0]), cmp);

    l 
= 0;
    r 
= (in[N - 1- in[0]) / (C - 1);
    
while (l <= r) {
        m 
= (l + r) / 2;
        
if (can(m))
            l 
= m + 1;
        
else
            r 
= m - 1;
    }

    printf(
"%d\n", r);

    
return 0;
}

posted on 2010-03-31 16:36 糯米 阅读(432) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理