JebTrains的员工正在庆祝一年中的第256天!JebTrains有 n 名员工和 k 个团队。每个员工都是某个(恰好是一个)团队的成员。所有队伍的编号从 1 到 k。您将得到一个数字数组 t1、t2、…、tn,其中ti是第i个员工的团队编号。
JebTrains将租一辆巴士送员工参加宴会。这辆公共汽车将乘坐一次或多次。一辆公共汽车可以载上一整队或两整队。如果三个或三个以上的团队一起骑行,他们可能会开始一个被认为不可接受的新项目。
禁止分成一个团队,所以团队的所有成员都应该乘坐同一辆车。
可以租一辆任何容量的公共汽车。这样一辆公共汽车一次最多可载 s 人。租金的总成本等于 s*r 伯尔斯,其中 r 是乘车次数。
请注意,租两辆或两辆以上的公共汽车是不可能的。
帮助JebTrains计算所有员工参加宴会所需的最低租金,满足上述所有条件。
题意:
给出 n 名员工和 k 个团队,每个员工只属于一个团队,这些人乘车去某地。一趟车最多可同行两支完整的队伍,最多可以租一辆车,承载人数 s,可以多次运人,共运 r 次。成本为 s*r。问 最小花费是多少。
输入
第一行包含两个整数n和k(1 ≤ n ≤ 5e5,1 ≤ k ≤ 8000)——JebTrains中的员工数量和团队数量。第二行包含整数t1、t2、…、tn的序列,其中ti(1 ≤ ti ≤ k)是第i名员工的团队编号。每个团队至少包含一名员工。
输出
打印租金的最低成本。
Input1
6 3
3 1 2 3 2 3
Output1
6
Input2
10 1
1 1 1 1 1 1 1 1 1 1
Output2
10
Input3
12 4
1 2 3 1 2 3 4 1 2 1 2 1
Output3
12
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int n,m;
int a[N];
void solve()
{cin>>m>>n;for (int i=0;i<m;i++){int x;cin>>x;a[x]++;}sort (a+1,a+n+1);int l=a[n];int r=a[n-1]+a[n];int ans=2e9;for (int k=l;k<=r;k++){int cnt=0;int i=1,j=n;while (i<=j){if (i!=j){if (a[i]+a[j]<=k) {i++;j--;cnt++;}else {j--;cnt++;}}else {i++;j--;cnt++;}}ans=min(ans,cnt*k);if (cnt==(n+1) /2) break;//开始时,cnt最大,随着k的增加,cnt逐渐减小;//当cnt能等于n的一半的时候,说明正好能将车队两两匹配,//之后继续增加k,也不能减小cnt,因为一趟车最多同时承载两个团队}cout<<ans<<endl;
}
signed main()
{ios;int T=1;//cin>>T;while (T--) solve();return 0;
}