【贪心】排队接水最小平均等待时长

题目描述

夏天到了,又到了用水高峰期,偏巧小区的水管出了点问题,消防车赶紧给小区送了一车水过来。小区居民们纷纷拿出自家装水的容器,有的是个大塑料瓶,有的是茶水壶,有的是小塑料桶,哈哈,什么样的都有:)。现在有n个人在一个水龙头前排队接水,假设每个人接水的时间分别为Ti,请编程找出这n个人排队的一种顺序,使得这n个人的平均等待时间最小。

输入要求

输入有多组测试数据

每组测试数据共两行,第一行为一个整数n,表示有n个人;

输出要求

输出文件有两行,第一行为一种排队顺序,即编号从1到n的n个人的一种排序方式;

第二行为这种排序方案下的平均等待时间(输出结果精确到小数点后两位)。

输入样例
10
56 12 1 99 1000 234 33 55 99 812

输出样例
3 2 7 8 1 4 9 6 10 5
291.90
**

代码

看到这种题目就想用结构体排序嘿嘿嘿

#include <bits/stdc++.h>
using namespace std;
typedef struct A
{
    int xb;//下标
    int time;//时间
} A;
bool cmp(A a,A b)
{
    return a.time<b.time;
}
int main()
{
    A a[1001];
    int i,n,t=0;
    double sum=0;
    int lp;
    while(cin>>n)
    {
        t=0,sum=0;
        memset(a,0,sizeof(a));
        for(i=0; i<n; i++)
        {
            cin>>a[i].time;
            a[i].xb=t++;
        }
        sort(a,a+t,cmp);
        for(i=0; i<t-1; i++)
        {
            cout<<a[i].xb+1<<" ";
            sum+=a[i].time*(t-1-i);//当前接水时间*当前排队人数
        }
        sum+=a[i].time*(t-1-i);
        cout<<a[i].xb+1<<endl;
        //cout<<sum<<endl;
        printf("%.2lf\n", sum / n);

    }


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值