Equalizing by Division (hard version)

這道題好暴力啊。。。。。。

把所

有數到0的轉移狀態和權值都記錄下來,這裏就用V【i】【j】表示 1~1e6的數轉化到i的步數

#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <numeric>
#include <ctype.h>
#define  LL long long
#define  ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define MODD(a,b) (((a%b)+b)%b)
using namespace std;
const double eps = 1e-2;
const int maxn = 2e5 + 5;
int vis[maxn];
int a[maxn];
int n,k;
int dis[maxn];
vector<int> V[maxn];
int main()
{
    scanf("%d%d",&n,&k);
    for(int i = 0; i < n; i++) scanf("%d",&a[i]);
    sort(a,a + n);
    for(int i = 0; i < n; i++){
      int x = a[i],cnt = 0;
      while(x){
        V[x].push_back(cnt);
        x/=2;
        cnt++;
      }
      V[0].push_back(cnt);
    }
    for(int i = 0; i < maxn; i++){
      sort(V[i].begin(),V[i].end());
    }
    int ans = INF;
    for(int i = 0; i < maxn; i++){
      //int f = a[i];
      if(V[i].size() >= k)
      ans = min(ans,accumulate(V[i].begin(),V[i].begin() + k,0));
    }
    printf("%d\n",ans);


    return 0;
}
/*50 2
72548 51391 1788 171949 148789 151619 19225 8774 52484 74830 20086 51129 151145 87650 108005 112019 126739 124087 158096 59027 34500 87415 115058 194160 171792 136832 1114 112592 171746 199013 101484 182930 185656 154861 191455 165701 140450 3475 160191 122350 66759 93252 60972 124615 119327 108068 149786 8698 63546 187913*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章