The Feast and the Bus(枚举/双指针/贪心)

题目链接:
题意:给定n个数所属集合,每次运输可以最多2个集合,同一集合必须一起运输;运输空间大小为s,运输次数为res,需要代价为s*res,现设计一个方案求最小代价。n<=2e5,集合数k<=8000。
题解:直接枚举,双指针贪心取数。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
const int maxn=500010;


int n,k;
int a[maxn];
int main(){
    scanf("%d%d",&n,&k);
    int x;
    for(int i=1;i<=k;i++) a[i]=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&x);
        a[x]++;
    }
    sort(a+1,a+k+1);
    int mn=a[k],mx=a[k]+a[k-1];
    ll ans=inf;
    for(int s=mn;s<=mx;s++){
        int l=1,r=k;
        int res=0;
        while(l<=r){
            if((l<r)&&a[l]+a[r]<=s){
                l++;r--;
            }else{
                r--;
            }
            res++;
        }
//        printf("res:%d s:%d\n",res,s);
        ans=min(ans,1LL*res*s);
    }
    printf("%I64d\n",ans);
    return 0;
}

发布了71 篇原创文章 · 获赞 1 · 访问量 2825

猜你喜欢

转载自blog.csdn.net/weixin_43918473/article/details/103047986