牛牛找子集(二分)

牛牛找子集(二分)

思路:经典二分题,具体看代码。

#define se second
#define fi first
class Solution {
public:
    /**
     * 返回找到能够满足游戏胜利条件的子集,如果有多个子集满足条件,返回字典序最小的即可。
     * @param n int整型 代表数字的数量
     * @param k int整型 代表子集的大小
     * @param s int整型vector 代表数字数组
     * @return int整型vector
     */
    map<int,int>mp;
    vector<int>ans;
    bool check(int k,int x){
        int id=0,s=0;
        for(auto p:mp){
          if(p.se>=x&&s<k){
             int cnt=p.se/x;
             for(int i=0;i<min(k-s,cnt);i++)
                ans[id++]=p.fi;
             s+=min(k-s,cnt);
          }
          if(s==k) return 1;
        }
        return 0;
    }
    vector<int> solve(int n, int k, vector<int>& s) {
       for(int i:s){
           mp[i]++;
       }
        ans.resize(k,0);
        vector<int>res;
       int l=1,r=n/k;
      while(l<=r){
          int mid=(l+r)>>1;
          if(check(k,mid)) res=ans,l=mid+1;
          else r=mid-1;
      }
        return res;
    }
};

你可能感兴趣的:(二分)