藍橋杯-演算法訓練-最小乘積(基本型)
阿新 • • 發佈:2019-01-02
演算法訓練 最小乘積(基本型)
問題描述
給兩組數,各n個。
請調整每組數的排列順序,使得兩組資料相同下標元素對應相乘,然後相加的和最小。要求程式輸出這個最小值。
例如兩組數分別為:1 3 -5和-2 4 1
那麼對應乘積取和的最小值應為:
(-5) * 4 + 3 * (-2) + 1 * 1 = -25 輸入格式 第一個行一個數T表示資料組數。後面每組資料,先讀入一個n,接下來兩行每行n個數,每個數的絕對值小於等於1000。
n<=8,T<=1000 輸出格式 一個數表示答案。 樣例輸入
請調整每組數的排列順序,使得兩組資料相同下標元素對應相乘,然後相加的和最小。要求程式輸出這個最小值。
例如兩組數分別為:1 3 -5和-2 4 1
那麼對應乘積取和的最小值應為:
(-5) * 4 + 3 * (-2) + 1 * 1 = -25 輸入格式 第一個行一個數T表示資料組數。後面每組資料,先讀入一個n,接下來兩行每行n個數,每個數的絕對值小於等於1000。
n<=8,T<=1000 輸出格式 一個數表示答案。 樣例輸入
2 3 1 3 -5 -2 4 1 5 1 2 3 4 5 1 0 1 0 1
樣例輸出
-25
6
#include<iostream> #include<algorithm> using namespace std; int main() { int T; cin >> T; while (T>0) { int n,min,sum=0; cin >> n; int dig1[8]; int dig2[8]; for (int i = 0; i < n; i++) cin >> dig1[i]; for (int i = 0; i < n; i++) cin >> dig2[i]; for (int i = 0; i < n; i++) { sum = sum + dig1[i]*dig2[i]; } min = sum; //給min賦初值 sort(dig1,dig1+n); //減小複雜度 sort(dig2,dig2+n); do { do { sum = 0; for (int i = 0; i < n; i++) { sum = sum + dig1[i] * dig2[i]; } if (sum <min) { min = sum; } if (sum > min) break; } while (next_permutation(dig2, dig2+ n)); } while (next_permutation(dig1,dig1+n)); cout << min << endl; T--; } return 0; }