1. 程式人生 > >藍橋杯 演算法訓練 ALGO-53 最小乘積(基本型)

藍橋杯 演算法訓練 ALGO-53 最小乘積(基本型)

演算法訓練 最小乘積(基本型)
時間限制: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;
}