解题思路:假设每一组输入分别为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.0分

4 人评分

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

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

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

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

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

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

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

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

评论列表 共有 1 条评论

aparece 1年前 回复TA
膜拜大佬,大佬太强了。解题思路清晰。