程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> CodeForces 558C Amr and Chemistry (位運算,數論,規律,枚舉)

CodeForces 558C Amr and Chemistry (位運算,數論,規律,枚舉)

編輯:C++入門知識

CodeForces 558C Amr and Chemistry (位運算,數論,規律,枚舉)


Codeforces 558C

題意:給n個數字,對每個數字可以進行兩種操作:num*2與num/2(向下取整),求:讓n個數相等最少需要操作多少次。

分析:

計算每個數的二進制公共前綴.

枚舉法亦可。

 

/*
*Author : Flint_x 
*Created Time : 2015-07-22 12:33:11 
*File name : whust2_L.cpp 
*/

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 2139062143
using namespace std;
const double eps(1e-8);

typedef long long lint;

#define cls(a) memset(a,0,sizeof(a))
#define rise(i,a,b) for(int i = a ; i <= b ; i++)
#define fall(i,a,b) for(int i = a ; i >= b ; i--)

const int maxn = 100000 + 5;
int num[maxn];
int temp[maxn];
int odd[maxn],cnt[maxn];
int n;

int main(){
   // freopen(input.txt,r,stdin);
//  freopen(output.txt,w,stdout);
	
	while(cin >> n){
		for(int i = 1  ; i <= n ; i++){
			scanf(%d,&num[i]);
		}
		cls(cnt);cls(odd);
		sort(num+1,num+n+1);
		for(int i = 1 ; i <= n ; i++) temp[i] = num[i];
		int t = num[1];
		for(int i = 1 ; i <= n ; i++){
			while(t ^ num[i]){
				if (t < num[i]) num[i] >>= 1;
				else t >>= 1;
			}
		}
		for(int i = 1 ; i <= n ; i++) num[i] = temp[i];
		for(int i = 1 ; i <= n ; i++){
			while (num[i] ^ t){
				cnt[i]--;
				if(num[i] % 2) odd[i] = cnt[i];
				num[i] >>= 1;
			}
		}
		lint ans = inf;
		for(int i = 0 ; i < 20 ; i++){
			lint x = 0;
			for(int j = 1 ; j <= n ; j++){
				if (odd[j] == 0 || cnt[j] + i <= odd[j]) x += abs(cnt[j] + i);
				else x += abs(odd[j]) + abs(odd[j] - (cnt[j] + i));
				
			}
//			cout << x << endl;
			ans = min(ans,x);
		}
		cout << ans << endl;
	}
    return 0;
}
        


 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved