对于第一位同学来说,由于发消息是在收拾离开之前发生的,所以他发消息的时间就是他的进门时间s + 答疑时间a
对于第二位同学,他发消息的时间除了自己进门的时间 + 答疑时间,还应该包括前一位同学的进门时间 + 答疑时间 + 收拾时间
以此类推
为了保证总的时间最短,需要安排进门时间 + 答疑时间 + 收拾时间 最少的同学在最前面。若两个同学的总时间相同,则将 进门时间 + 答疑时间短的同学安排在前面。
#include <iostream>
#include <algorithm>
using namespace std;
struct stu{
int a;
int s;
int e;
int sum;
}student[1001];
bool cmp(stu x,stu y){
if((x.a+x.s+x.e)==(y.a+y.s+y.e))return (x.s+x.a) < (y.s+y.a);
else return (x.a+x.s+x.e)<(y.a+y.s+y.e);
}
int main()
{
// 请在此输入您的代码
int n;
long long ans=0;
cin >> n;
for(int i=0;i<n;i++){
cin >> student[i].s >> student[i].a >> student[i].e;
}
sort(student,student+n,cmp);
student[0].sum = student[0].a + student[0].s;
ans = ans + student[0].sum;
for(int i=1;i<n;i++){
student[i].sum += student[i].a + student[i].s +student[i-1].sum + student[i-1].e;
ans += student[i].sum;
}
cout << ans << endl;
return 0;
}