zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java位运算
    java笔试题(面试题)系列之一
    Java数据类型转换总结
    ++a和a++
    Java IO
    Java 并发
    Java位运算及补码存储
    Redis 5.0.0安装部署(伪集群版)
    Redis 安装(单机版)
    Dubbo源码分析系列之【服务暴露】
  • 原文地址:https://www.cnblogs.com/liyexin/p/13381162.html
Copyright © 2011-2022 走看看