P8732题解

· · 题解

十年 OI 一场空,不开 long long 见祖宗!!!

分析:

这是一道很经典的贪心题。

要求我们找出同学在课程群中所发信息的间隔最小。

简单地说,就是让同学发消息的间隔尽可能紧凑。

那么,也就是将它们的用时从小到大排列,让前面的用时越短越好。

前面的用时又分为三部分:

  1. 进入办公室的时间。

  2. 答疑所用的时间(发消息的时间)。

  3. 收拾东西离开的时间。

让我们分析一下,第一位同学用时为发消息之前的两条。

但是他收拾东西离开的时间大小会影响下一位同学。

所以应该比较三条时间之和。

若时间之和相等呢?

那就仅比较前两条的大小,原因上面已经给出。

还有一个细节:

要求是发消息的时刻之和,而每个同学占用时间的加和是时刻。

所以我们还要把每个时刻再加起来。

AC Code:

//2023/3/30
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num,ans;
struct stu{
    long long si,ai,ei;
}a[1010];
bool cmp(stu x,stu y)
{
    long long hex=x.ai+x.ei+x.si;
    long long hey=y.ai+y.ei+y.si;
    if(hex==hey)
    {
        return x.ai+x.ei<y.ai+y.ei;
    }
    else
    {
        return hex<hey;
    } 
}
int main()
{
    long long n,he=0,zonghe=0;
    cin>>n;
    for (int i=0;i<n;i++)
    {
        cin>>a[i].si>>a[i].ai>>a[i].ei;
    }
    sort(a,a+n,cmp);
    for (int i=0;i<n;i++)
    {
        if(i>=1)
        {
            he+=a[i-1].ei;
        }
        he+=a[i].si;
        he+=a[i].ai;
        zonghe+=he;
        //cout<<he<<endl;
    }
    cout<<zonghe<<endl;
    return 0;
}