藍橋杯 演算法訓練 ALGO-53 最小乘積(基本型)
阿新 • • 發佈:2018-12-21
演算法訓練 最小乘積(基本型)
時間限制:1.0s 記憶體限制:512.0MB
提交此題
問題描述
給兩組數,各n個。
請調整每組數的排列順序,使得兩組資料相同下標元素對應相乘,然後相加的和最小。要求程式輸出這個最小值。
例如兩組數分別為: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, *n; int **a, **b; int i, j, sum; //輸入資料組數T,開闢兩對T個數組a,b,開闢長度為T的陣列n cin >> T; a = new int*[T]; b = new int*[T]; n = new int[T]; //輸入並排序 for(i = 0; i < T; i++) { //輸入陣列長度n,開闢一對長度為n的陣列a,b cin >> n[i]; a[i] = new int[n[i]]; b[i] = new int[n[i]]; //為這對陣列輸入資料 for(j = 0; j < n[i]; j++) cin >> a[i][j]; for(j = 0; j < n[i]; j++) cin >> b[i][j]; //第一步,排序:為這對陣列排序 sort(a[i], a[i]+n[i]); sort(b[i], b[i]+n[i]); } //計算T對陣列相應下標相乘之和最小的結果並輸出 for(i = 0; i < T; i++) { sum = 0; for(j = 0; j < n[i]; j++) //第二步,運算 sum += a[i][j] * b[i][n[i]-j-1]; //第三步,求和 cout << sum << endl; //輸出該組結果 } return 0; }