原题链接:蓝桥杯算法提高-能量项链
解题思路:
要得到最大值,每次聚合时把小的数消掉,这样后面聚合得到的值就会越大,如(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分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
@cyyxcc 确实是写错了,谢谢提醒
老兄你列子算错了,(3,2) (2,10)聚合应该是60吧