P8732题解
十年 OI 一场空,不开 long long 见祖宗!!!
分析:
这是一道很经典的贪心题。
要求我们找出同学在课程群中所发信息的间隔最小。
简单地说,就是让同学发消息的间隔尽可能紧凑。
那么,也就是将它们的用时从小到大排列,让前面的用时越短越好。
前面的用时又分为三部分:
-
进入办公室的时间。
-
答疑所用的时间(发消息的时间)。
-
收拾东西离开的时间。
让我们分析一下,第一位同学用时为发消息之前的两条。
但是他收拾东西离开的时间大小会影响下一位同学。
所以应该比较三条时间之和。
若时间之和相等呢?
那就仅比较前两条的大小,原因上面已经给出。
还有一个细节:
要求是发消息的时刻之和,而每个同学占用时间的加和是时刻。
所以我们还要把每个时刻再加起来。
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;
}