zoukankan      html  css  js  c++  java
  • CF 1077D

    http://codeforces.com/contest/1077/problem/D

    一直不理解check内第二重循环的意思,突然一下想通了。。好像有点犯蠢

    //D - Cutting Out CodeForces - 1077D 
    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 2e5+10;
    map<int,int> m;
    vector<int> s;
    vector<int> ans;
    int check(int cnt)
    {
        //二分遍历查找合适的取出个数 
        // cnt为取出的个数 
        ans.clear();
        for(int i = 0; i < s.size(); i++){
            int w = m[s[i]] / cnt;   // 如果一个数字可以取出多次,就取多次 
            for(int j = 1; j <= w; j++){
                ans.push_back(s[i]);
            } 
        }
        return ans.size();
    }
    int main()
    {
        int n, k, c = -1, num;
        cin >> n >> k;
        for(int t,i = 1; i <= n; i++) {
            cin >> t;
            if(!m[t])
                s.push_back(t);
            m[t]++;
            c = max(c,m[t]);
        }
        int l = 1, r = c;
        while(l <= r) {
            int mid = (l+r)/2;
            if(check(mid) >= k) {
                l = mid+1;
                num = mid;
            } else r = mid-1;
        }
        check(num);
        for(int i = 0; i < k; i++)
            cout << ans[i] << " ";
        return 0;
    }
    View Code
  • 相关阅读:
    hdu1233
    zoj 3529
    hdu 2516 取石子游戏
    组合博弈理论
    博弈——sg函数的原理和优化
    博弈及sg函数
    poj2039
    hdu 1250
    C# 类的继承和访问
    C# 索引
  • 原文地址:https://www.cnblogs.com/JiaaaaKe/p/11231693.html
Copyright © 2011-2022 走看看