bzoj 3969 LOW Power

3969: [WF2013]Low Power

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://www.lydsy.com/JudgeOnline/problem.php?id=3969

Description

有n个机器,每个机器有2个芯片,每个芯片可以放k个电池。
每个芯片能量是k个电池的能量的最小值。
两个芯片的能量之差越小,这个机器就工作的越好。
现在有2nk个电池,已知它们的能量,我们要把它们放在n个机器上的芯片上,
使得所有机器的能量之差的最大值最小。

Input

第一行,两个正整数,n和k。
第二行,2nk个整数,表示每个电池的能量。

 

Output

一行一个整数,表示所有机器的能量之差的最大值最小是多少。

 

Sample Input

2 3
1 2 3 4 5 6 7 8 9 10 11 12

Sample Output

1

HINT

 2nk <= 10^6, 1 <= pi <= 10^9。

【题目大意】

让最大差值的机器的值最小。

【思路】

二分答案

【code】

我对二分右端点有点疑问。有的dalao r=排序后最后一个 我怎么觉得是 2*n*k-k+1个....

bzoj崩了...没测...

先考虑二分什么 ...二分的左右端点是什么...

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,mid,ans,l,r;
int w[1000005];
bool check()
{
    /*for(int i=2*n;i;i--)
    {
        if(w[i]-w[i-1]>mid)
        return false;
    }*/
    for(int p=1,q=1;p<=2*n*k&&q<=n;p++)
    {
        if(2*q*k!=p)return false;
        if(w[p]-w[p-1]>mid)p++,q++; 
    }
    return true;
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=2*n*k;i++)
    scanf("%d",&w[i]);
    sort(w+1,w+2*n*k+1);
//    l=w[2]-w[1];
    r=w[2*n*k-k+1]-w[1];//*** 
    l=0;//最小两个数的差不一定最小。 
    while(l<=r)
    {
        mid=l+(r-l)/2;
        if(check())ans=mid,r=mid-1;
        else
        l=mid+1;
    }
    printf("%d\n",ans);
    return 0;
 } 

 

转载于:https://www.cnblogs.com/zzyh/p/7041079.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值