解题思路:
    要得到最大值,每次聚合时把小的数消掉,这样后面聚合得到的值就会越大,如(5,3)(3,2)(2,10)(10,5)这样的一个序列

其中2最小首先把2消去, 即 (3,2)和(2,10)聚合 得到值 sum = 60,得新组合(3,10);

剩下 (5,3)(3,10)(10,5)

其中3最小我们消去3,得sum = 60 + 150 = 210;

最后(10,5)(5,10) 得 sum = 60 + 150 + 500 = 710;

参考代码:

#include #include using namespace std;
int arr[105];
const int inf = 1005; // 最大数为1005

int main(){
	int n, x, sum = 0;
	map mp;
	cin >> n;
	for (int i = 0; i < n; i++) cin >> arr[i];
	for (int i = 0; i < n; i++) { 
		if (i == n - 1) mp[arr[i]] = arr[0];
		else mp[arr[i]] = arr[i + 1];
	}
	
	for (int i = 0; i < n-1; i++) {
		int Min = inf, index = 0;
		for (map::iterator it = mp.begin(); it != mp.end(); ++it) {//找到最小数
			if (Min > (*it).second) Min = (*it).second, index = (*it).first;
		}
		sum += index * Min * mp[Min];
		mp[index] = mp[Min]; //聚合成新的组合
		mp[Min] = inf;//把最小数所对应的值改为inf,不再考虑这个组合
	}
	cout << sum << endl;

	return 0;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

北川 3年前 回复TA

@cyyxcc 确实是写错了,谢谢提醒

cyyxcc 3年前 回复TA

老兄你列子算错了,(3,2) (2,10)聚合应该是60吧