1. 程式人生 > 實用技巧 >CF1250B The Feast and the Bus(貪心+列舉)(來自洛谷)

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; }