您的位置:首页 > 其它

604B

2016-02-24 12:59 225 查看
题意:给定一个n和一个k,满足(1 ≤ n ≤ 2·k ≤ 100 000),然后给你n个数,按照不递减排列的,这里的k表示的是箱子的个数,你需要把这n个数装到k个箱子里面,一个箱子最多装两个数,这两个数的和就是箱子的容量。最后求箱子的最小容量时多少。

这个题有点坑,首先我们要考虑一下k>n的情况哈,那么就是n个数的最后一个数就是箱子的容量。

然后注意:

我们是不是想把小的尽量和小的组合放在一个箱子里面?

那么你就出错了哈,当时我就是靠这组数据去HACK的别人

4 2

1 2 3 5

如果你按照小的和小的组合,那么答案就是8

正确答案应该是6

然后你就会说那么就是小的和大的组合在一起。

那么你看这组数据:

5 3

1 1 2 2 8

你如果让小的和大的组合在一起,答案就是9

其实答案是8

不废话了,希望想想。

[cpp]
view plain
copy

print?

#include<bits/stdc++.h>  
using namespace std;  
long long a[100005];  
int main()  
{  
    int n,k;  
    while(~scanf("%d%d",&n,&k))  
    {  
        long long mm=-1;  
        for(int i=0; i<n; i++)  
        {  
            scanf("%lld",&a[i]);  
            mm=max(mm,a[i]);  
        }  
        int i,j;  
        if(2*k==n)//如果是刚好两倍的情况,那么就是大的和小的组合  
        {  
            i=0;  
            j=n-1;  
            for(int i=0;i<n/2;i++)  
            {  
                mm=max(mm,a[i]+a[j--]);  
            }  
        }  
        else//否则的话就应该用多出的箱子把当前最大的数字装了,然后再小的和大的组合,贪心的思想  
        {  
            j=n;  
            int cnt=n-k;  
            int cc=n-cnt*2;  
            while(cc--)  
            {  
                j--;  
            }  
            for(i=0;i<cnt;i++)  
            {  
                mm=max(mm,a[i]+a[--j]);  
            }  
        }  
        printf("%lld\n",mm);  
    }  
}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: