首页 > 代码库 > 洛谷 P1223 排队接水(贪心,桶排序)

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

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

题目链接: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 排队接水(贪心,桶排序)