CF1250B The Feast and the Bus(贪心+枚举)(来自洛谷)

洛谷地址:https://www.luogu.com.cn/problem/CF1250B

题意:

n个人,k个队伍,每个人属于队伍ai,汽车一次至多载两只队伍(全员),费用为车的容量*载人次数,问最少花费。

解析:

对k个组的人数进行从小到大的排序。

那么车容量至少为ak,才能保证按条件运送所有队伍。

假设一个大组上了车,就贪心地上一个小组。因为每次最多运两个组,这样是省容量的最优方法。

枚举容量,ak~maxx(最大的ai+ak-i+1和)

定义l=1,r=k,如果可以被装走,l++,r--,否则,就让大组优先上

如果末尾l==r了,说明还有一个组没有上车,cnt++即可。

#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<string.h>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=8e3+10;
ll a[maxn];
int main()
{    
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        int x;
        cin>>x;
        a[x]++;
    }
    sort(a+1,a+1+k);
    ll maxx=0;
    for(int i=1;i<=k;i++)
    {
        maxx=max(maxx,a[i]+a[k-i+1]);
    }
    
    ll minn=1e16;
    for(ll i=a[k];i<=maxx;i++)
    {int cnt=0;
        ll l=1,r=k;
        while(l<r)
        {
            cnt++;
            if(a[l]+a[r]<=i)
            {
                l++;
                r--;
            }
            else
                r--;
        }
        if(l==r)
            cnt++;
        minn=min(minn,i*cnt);
    }
    cout<<minn<<endl;
}
原文地址:https://www.cnblogs.com/liyexin/p/13381162.html