• luogu P1223 排队接水 x


     P1223 排队接水

    题目描述

    有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不重复

    思路:

      贪心:先让花时间最少的人先接水,这样等的时间是最少的(不懂的话可以手动模拟一下~)

      但是因为最后还要输出方案,所以需要开结构体,让编号跟着时间一起进行快排

    坑点:

      千万不要忘记输出方案!(本来想用map做排序的我发现根本不会用map,蒟蒻瑟瑟发抖...)

      如果不会用结构体的话,还可以用两个数组来做,一个记录编号,一个记录时间,然后手写排列,两个一起进行排序.

    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <map>
    #define LL long long
    
    using namespace std;
    
    const int M = 1008;
    int n;
    double ans;
    
    struct A{
        int z,num;
        bool operator < (const A &qwq)const
        {
            return z < qwq.z;
        }
    }t[M];
    
    void Dengren(int times,int persons)
    {
        ans+=(double)times*persons;
    }
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld",&t[i].z),t[i].num=i;
        sort(t+1,t+1+n);///从小到大
        for(int i=1;i<=n;i++)
        {
            printf("%lld ",t[i].num);
            Dengren(t[i].z,n-i);
        }
        printf("
    ");
        ans/=n;///因为最后输出的是平均等待时间
        printf("%.2lf",ans);
        return 0;
    }
    View Code

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    如何在Mac OS X上安装 Ruby运行环境
    CocoaPods安装和使用教程
    【Objective-C】07-自定义构造方法和description方法
    window cmd 命令大全 (order)
    vue methods 方法中 方法 调用 另一个方法。
    js ---- 函数防抖
    three.js 运行3D模型
    点击保存网页 (及页面的数据)
    js -- canvas img 封装
    js -- 分页功能
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7073978.html
Copyright © 2020-2023  润新知