代码改变世界

Equalizing by Division (hard version)

2019-09-17 19:34  木木王韦  阅读(182)  评论(0)    收藏  举报

Equalizing by Division (hard version)

Codeforces题目链接
这道题的意思是至少有多少次除2操作,是数组中出现k个相等的数。
困难版和简单版的差别在于数据范围。


#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[200020];
int n,k;int b[200020];
int c[200020];
int main(){
	cin>>n>>k;	
	memset(b,0,sizeof(b));	
	memset(c,0,sizeof(c)); 	
	for(int i=0;i<n;i++){	
		cin>>a[i];			
	}	
	sort(a,a+n);	
	int minn=0x3f3f3f3f;		
	for(int i=0;i<n;i++){		
		int tt=0;		
		int kk=a[i];		
		while(kk){		
			b[kk]++;			
			c[kk]+=tt;			
			if(b[kk]==k){			
				minn=min(minn,c[kk]);			
			}			
			kk/=2;			
			tt++;		
		}			
	}	
	cout<<minn<<endl;
	return 0;
} //by lw