梦泽


私信TA

用户名:2717117243

访问量:1273

签 名:

等  级
排  名 8146
经  验 1252
参赛次数 0
文章发表 2
年  龄 19
在职情况 学生
学  校 HUBU
专  业

  自我简介:

TA的其他文章

c++ 详细题解
浏览:146

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

5 人评分

  评论区

膜拜大佬,大佬太强了。解题思路清晰。
2023-02-23 21:08:28
  • «
  • 1
  • »