[洛谷]P1223 排队接水

题目描述

有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。

输入输出格式

输入格式:

输入文件共两行,第一行为n;第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。

输出格式:

输出文件有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

--

思路

排序+贪心。

首先我们要排的是所有的元素,但是为什么是从小到大呢???

由于若把时间长的放在后面接水,那么就较少人等,所以排序+贪心即可。

对于每一个人,在场剩余每个人都要经历一次他的打水时间。

故遍历整个数组求其他人在这个人打水时花费的总时间累加到变量sum上,最后sum除以n(算平均值)。

注意:

1.数据规模 要用long long 或double;

2.数据形式转换,整型除以整型是要取整的

#include <stdio.h>
#include <iostream>
#include <algorithm>
int main()
{
	int n;
	long long a[1001]={},b[1001]={};
	scanf("%d",&n);
	int i,j;
	double sum=0;
	for(i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);//a数组记录时间
		b[i]=i;//b数组记录编号
	}
	int t;//临时变量t
	for(i=1;i<=n-1;i++)
		for(j=1;j<=n-i;j++)
		{//冒泡排序
			if(a[j]>a[j+1])//如果前一个人的时间比后一个人的时间长
			{
				t=a[j];a[j]=a[j+1];a[j+1]=t;//交换
				t=b[j];b[j]=b[j+1];b[j+1]=t;//同理
			}//也可以使用iostream中的swap
		}//也可以使用algorithm的sort
	double num=0;
	for(i=1;i<=n;i++)
	{
		num=0;
		for(j=i-1;j>=1;j--) 
		{
			num+=a[j];//累加等待时间
		}
		//printf("%d ",num);//累加等待时间
		sum = sum+num;
	}
	for(i=1;i<=n;i++)
	{
		printf("%lld ",b[i]);//先输出编号
	}
	printf("\n%.2f",sum/n);//平均值
	return 0;
}


猜你喜欢

转载自blog.csdn.net/apro1066/article/details/80302250