社区讨论

贪心求hack

CF1133EK Balanced Teams参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lovep96u
此快照首次捕获于
2023/11/12 19:42
2 年前
此快照最后确认于
2023/11/12 21:12
2 年前
查看原帖
考虑贪心,让每一队尽可能紧凑,最后按队伍人数从大到小加到答案, 为啥是错的? code:
CPP
#include <bits/stdc++.h>
#define MAXn 5010
using namespace std;

int n, k;
int a[MAXn];
vector<int> num[MAXn];
int cnt;
bool com(vector<int> x, vector<int> y) { return x.size() > y.size(); }

int main() 
{
    cin >> n >> k;
    for(int i = 1; i <= n; i++) 
        cin >> a[i];
    sort(a + 1, a + n + 1);
    num[++cnt].push_back(a[1]);
    for(int i = 2; i <= n; i++)
    {
        if(num[cnt][num[cnt].size() - 1] + 5 < a[i] || a[i] - num[cnt][0] > 5)
        {
            num[++cnt].push_back(a[i]);
            continue;
        }
        int l = 1, r = cnt, res = cnt + 1;
        while(l <= r)
        {
            int mid = l + r >> 1;
            if(a[i] - num[mid][num[mid].size() - 1] <= 5 && a[i] - num[mid][0] <= 5)
            {
                r = mid - 1;
                res = mid;
            }
            else l = mid + 1;
        }
        if(res > cnt) cnt++;
        num[res].push_back(a[i]);
    }
    int ans = 0;
    sort(num + 1, num + cnt + 1, com);
    for(int i = 1; i <= min(k, cnt); i++)
    {
        ans += num[i].size();
    }
    cout << ans;
    return 0;   
}

回复

6 条回复,欢迎继续交流。

正在加载回复...