2011年常州市“信息与未来”程序设计小能手比赛试题--排队拍照

注:本题文件名为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;
} 

这道题目就这么多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值