成仙之路−> 算法基础课题解
思路:
1. 将所有时间从小到大进行排序
2. 总等待时间 = 对于每个时间 * 在这个时间需要等待的人数
证明:
假设 ti>ti+1
交换前时间:ti⋅(n−i)+ti+1⋅(n−i−1)
交换后时间:ti+1⋅(n−i)+ti⋅(n−i−1)
前−后:ti−ti+1>0
因此,当对于越大的需要等待人数 (n−i),时间 ti 越小越好
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int t[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>t[i];
sort(t,t+n); //排序
LL res=0;
for(int i=0;i<n;i++) res+=t[i]*(n-i-1); //时间 * 等待人数
cout<<res<<endl;
return 0;
}