解题思路:假设每一组输入分别为ai1 ,ai2 ,bi , Ai=ai1+ai2(每一组的时间总和减去离开教室的时间) , Ki=Ai+bi=ai1+ai2+bi(每一组的时间总和) , n组(在课程群里面发消息的时刻)相加后得到:
(A1+A2+...+An)+(n-1)K1+(n-2)K2+(n-3)K3+...+K(n-1);
(A1+A2+...+An)是固定的
将Kn升序排序,依次带入便是最小
注意事项:
sum总和可能超过int范围,所以用long long
参考代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
int nums[1000][3] = { 0 };//存放输入
int sums[1000] = { 0 };//存放前两位和,也可以省去
int sumss[1000] = { 0 };//存放三位和
int compare(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
int main()
{
int n;
int sum0 = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> nums[i][0] >> nums[i][1] >> nums[i][2];
sums[i] = nums[i][0] + nums[i][1];
sumss[i] = sums[i] + nums[i][2];
sum0 += sums[i];//得到所有前两位总和
}
qsort(sumss, n, sizeof(int), compare); //排序
long long int sum = 0; //sum可能会超过Int 范围
for (int i = 0; i < n; i++)
{
sum += sumss[i] * (n - i - 1); //(n-1)Ki
}
sum += sum0;//将所有前两位总和相加得到结果
cout << sum;
return 0;
}
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复