注:本题文件名为photo
题目描述
在一个美丽的景点,有N个同学想每人拍一张照片作为留念,于是他们就排好队一个一个来拍。但是呢,每个人拍照需要的时间是不同的,有些同学是在创作艺术,可能花费时间比较多;有些同学比较随意,只想证明自己到此一游而已。
考虑到排队排在后面的同学可能会等比较长的时间,为了让这个现象有所缓解,现在需要你来帮助他们找到一个排队的方案,使得所有人等待的时间总和最少。
输入
第一行包含一个整数N(N<=50000),表示有N个同学想要拍照。
第二行包含N个用空格隔开的整数,表示每个人拍照所需的时间T1,T2,......Tn。(1<=Ti<=100000)
输出
包含一个整数--所有人等待时间总和的最小值。
样例组
输入
5
2 3 1 5 4
输出 20
解题思路
这道题目是一道简单排序性贪心的题目,要做对这道题目主要有两点。
首先,要知道每个人的等待时间怎么算。每个人的等待时间是前面所有人的等待时间总和。但这道题目的数据范围(N<=50000)不允许用双循环来做,所以要用递推的方法做。
递推就是开一个变量sum,然后每循环一次,就加上数组T的前一个变量。求每个人的等待时间程序如下:
sum+=t[i-1],ans+=sum;
求等待时间总和的程序如下:
long long getans(int &t[],int n)
{
long long ans=0,sum=0;//保险起见
for(int i=2;i<=n;i++) sum+=t[i-1],ans+=sum;
return ans;
}
其次,我们还需要借助sort()函数。只要知道这道题是简单排序性贪心,我们就可以直接借助sort()函数来写。(验证过程见https://blog.csdn.net/ceshyong/article/details/125459211?spm=1001.2014.3001.5502)2012年常州市“信息与未来“程序设计小能手比赛试题--滑翔翼_ceshyong的博客-CSDN博客2012年常州市"信息与未来"程序设计小能手比赛试题--滑翔翼https://blog.csdn.net/ceshyong/article/details/125459211?spm=1001.2014.3001.5502
所以这道题目的主程序其实就一句话:
sort(t+1,t+n+1);
题目标程
以下是题目标程:
#include<bits/stdc++.h>
#define maxn 100001
using namespace std;
long long t[maxn],sum=0,ans=0,n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>t[i];
sort(t+1,t+n+1);
for(int i=1;i<=n;i++) sum+=t[i-1],ans+=sum;
cout<<ans;
return 0;
}
这道题目就这么多。