CodeForces - 1250B The Feast and the Bus (貪心+暴力)

題意

https://vjudge.net/problem/CodeForces-1250Bios

每一個人屬於隊伍ai,汽車一次至多載兩隻隊伍(全員),費用爲車的容量*載人次數,問最少花費。c++

思路

k(隊伍數)只有8000,從這個條件入手這題。先對每一個隊伍按人數從小到大排序,那麼a[k]就是車的最小容量,因而咱們能夠枚舉車的容量i從a[k]開始,用l=1和r=k從兩端遍歷數組a,若是a[l]+a[r]<=i,那麼l++,r--;不然讓人數大的隊伍先上,即r--。可是若是設車的容量爲a[k]+a[k-1],那麼會由於很噁心的數據TLE。因此要優化枚舉的容量,咱們貪心的分配隊伍上車,通常都會讓人數最多的人數最少的一塊兒上,即a[1]+a[k],a[2]+a[k-1],……只要在這些取最大值就是車容量的上限了。數組

代碼

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=5e5+5;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll a[N];
int main()
{
    std::ios::sync_with_stdio(false);
    ll n,k;
    cin>>n>>k;
    for(int i=1; i<=n; i++)
    {
        int x;
        cin>>x;
        a[x]++;
    }
    if(k==1)
    {
        cout<<a[1]<<endl;
        return 0;
    }
    ll mx=0;
    for(int i=1;i<=k;i++)
    {
        mx=max(mx,a[i]+a[k-i+1]);
    }
    sort(a+1,a+1+k);
    ll res=1e16;
    for(ll i=a[k]; i<=mx; i++)
    {
        ll l=1,r=k,cnt=0;
        while(l<r)
        {
            cnt++;
            if(a[l]+a[r]<=i)
                l++,r--;
            else
                r--;
        }
        if(l==r)
            cnt++;
        res=min(res,i*cnt);
    }
    cout<<res<<endl;
    return 0;
}
相關文章
相關標籤/搜索