1. 程式人生 > 實用技巧 >面試筆試演算法題備考(一)--阿里巴巴--排序

面試筆試演算法題備考(一)--阿里巴巴--排序

題目描述 等級:中等 知識點:排序、貪心 檢視題目:陣列變換 給出一個長度為 n 的陣列,和一個正整數 d。 你每次可以選擇其中任意一個元素 a[i] 將其變為 a[i] + d 或 a[i] - d,這算作一 次操作。 你需要將所有的元素全部變成相等元素,如果有解,請輸出最小操作次數,如果 無解請輸出 -1。 輸入數字 n、數字 d,和一個長度為 n 的陣列 a。1 <= n <= 100000,1 <= d <= 100, 1 <= a[i] <= 100000。 輸出一個數字,表示最小的操作次數,如果無解輸出 -1。 示例 1
輸入:
5
2
[3,5,7,1,9]
輸出:
6

注意

最優解為全部變為 5,共 1 + 0 + 1 + 2 + 2 = 6 次。 C++程式碼
#include <iostream>
#include 
<stdio.h> #include <string> #include <cmath> //#define Max 100000; /* 5 2 3 5 7 1 9 */ using namespace std; int Conversion(int a[], int n, int d); int main() { int Max = 100000; int n,d; int a[Max]; cin >> n; cin >> d; for (int i = 0;i < n; i++) { cin
>>a[i]; } int answer = Conversion(a,n,d); cout << answer << endl; return 0; } int Conversion (int a[], int n, int d) { int Max = 100000; int b[Max] = {0}; int c[Max] = {0}; int h[Max] = {0}; //取倍數 int temp = a[0]%d; c[0] = a[0]/d; h[0] = c[0]; for (int
i = 1;i<n;i++) { if (a[i]%d == temp) { c[i] = a[i]/d; h[i] = c[i]; } else{ return -1; } } int temptime = h[0]; for (int i=0; i<n-1; i++ ) { for(int j = 0; j < n-i-1; j++) { if (h[j] > h[j+1]) { int t = h[j]; h[j] = h[j+1]; h[j+1] = t; } } } int sum=0; temp = n/2; for (int i = 0; i<n ;i++){ sum+=abs(h[i]-h[temp]); } return sum; }