题目描述
测试样例
代码详解
#include<iostream>
#include<algorithm>
using namespace std;
long long sum=0;
struct Student{
long long si;//进门的时间
long long ai;//答疑的时间
long long ei;//出门的时间
long long zi;//总时间
long long di;//进门和答疑的时间和
}a[1010];//结构体数组取大10
bool cmp(Student a,Student b)//排序的方式
{
if(a.zi!=b.zi) return a.zi<b.zi;//若两个结构体的总时间不等,则从小到大排序
else return a.di<b.di;//反之则只比较进门和答疑的时间和
}
int main()
{
long long n,p=0;
cin>>n;
for(long long i=0;i<n;i++)
{
cin>>a[i].si>>a[i].ai>>a[i].ei;//读入数据
a[i].zi=a[i].si+a[i].ai+a[i].ei;//计算总时间
a[i].di=a[i].si+a[i].ai;//计算进门与答疑的时间
}
sort(a,a+n,cmp);//对结构体进行排序
for(long long i=0;i<n;i++)
{
sum+=p+a[i].si+a[i].ai;//让总时间等于学生进门时间加上答疑的时间再加上之前学生的总时间
p+=a[i].zi;//定义了一个longlong变量来计算到此为止之前学生所花的时间
}
cout<<sum<<endl;
return 0;
}
总结:题目考点就是结构体排序,要注意的也就是时刻的相加,额外定义了一个变量p来计算截至目前的时刻,再让sum+=p和学生进门与答疑的时间就好了
排序的话得先考虑学生花费的总时间,如果总时间相等再考虑学生进门和答疑的时间差距。