0
点赞
收藏
分享

微信扫一扫

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

zmhc 2022-09-26 阅读 68

洛谷地址:​​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;
}

 



举报

相关推荐

0 条评论