蓝桥杯_算法训练_最小乘积(基本型)

问题描述
  给两组数,各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
思路:将两行数组一个升序一个降序,对应相乘。得到的就是最后的结果。
代码还是比较简单的,如下
 1 #include<iostream>
 2 using namespace std;
 3 void sort(int a[],int n)//降序 
 4 {
 5     for(int i = 0; i < n; i++)
 6     {
 7         for(int j = 1; j < n-i; j++)
 8         {
 9             if(a[j-1]>a[j])
10             {
11                 int temp = a[j-1];
12                 a[j-1] = a[j];
13                 a[j] = temp;
14             }
15         }
16     }
17 }
18 int main()
19 {
20     int num;//组数 
21     int n;//每行n个数
22     int a[100]={0};//第一行 
23     int b[100]={0};//第二行 
24     long result = 0;//结果 
25     cin>>num;
26     for(int i = 0; i < num; i++)
27     {
28         cin>>n;
29         result = 0;
30         /*输入两行数据*/
31         for(int j = 0; j < n; j++)
32         {
33             cin>>a[j];
34         }
35         for(int j = 0; j < n; j++)
36         {
37             cin>>b[j];
38         }
39         /*将两行数据进行排序。一个升序,一个降序*/
40         sort(a,n);
41         sort(b,n); 
42         for(int j = 0; j < n; j++)
43         {
44             result += a[j]*b[n-j-1];
45         }
46         cout<<result<<endl;
47     } 
48     return 0;
49 } 

起初自己在输出result的时候没有输出换行符,结果就错了。提醒自己以后注意。

网上很多代码似乎很简单,我的排序可能并不是最简单的,但是也是常用的,对付这个题还是绰绰有余。

 
原文地址:https://www.cnblogs.com/allein-STR/p/7368134.html