码迷,mamicode.com
首页 > 编程语言 > 详细

洛谷 P1223 排队接水(贪心,桶排序)

时间:2016-12-23 14:20:30      阅读:3920      评论:0      收藏:0      [点我收藏+]

标签:get   include   精确   个数   排列   for   name   code   printf   

此题为洛谷普及试炼场的一道水题。。。。

题目链接:https://www.luogu.org/problem/show?pid=1223

题目描述

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

输入输出格式

输入格式:

 

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
10 
56 12 1 99 1000 234 33 55 99 812
输出样例#1:
3 2 7 8 1 4 9 6 10 5
291.90

说明

n<=1000

ti<=1e6,不保证ti不重复

 

分析:

嗯。。。。题目意思就是让一些人去接水,有的人水瓶大,接满花的时间多,有的人花的时间少 ,现在问怎么排队,才能使平均接水等待时间最少。。。那么我们知道总共的等待时间是第一个人的时间一直加到第n个人,那么就可以先让时间少的去打,这样就可以知道花的时间最少。。。。

那么题目中最多有1000个人,并且其中的ti不重复,那么我们就可以用一个1e6的桶来装数据(用于输出顺序),然后再求出平均时间;

 

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>

using namespace std;

int n,f[1000010],data[1010];
double tot,cnt;

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        int a;
        cin>>a;
        data[i]=a;
        f[a]=i;
    }
    for(int i=0;i<=1000000;i++)
        if(f[i]) cout<<f[i]<<" ";
    cout<<endl;
    sort(data+1,data+1+n);
    for(int i=1;i<=n;i++){
        cnt+=data[i-1];
        cnt/=n;
        tot+=cnt;
        cnt*=n;
    }
    printf("%.2lf\n",tot);
}

 

洛谷 P1223 排队接水(贪心,桶排序)

标签:get   include   精确   个数   排列   for   name   code   printf   

原文地址:http://www.cnblogs.com/zzozz/p/6214341.html

(3)
(4)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!