• 洛谷 P1223 排队接水


    洛谷 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不重复

    思路:

    贪心算法,排队接水时从时间小的往后排,等待时间最少,记录下所有人的等待时间的和(注意,第一个人等待时间为0,第二个人的等待时间为第一个人接水的时间,以此类推),求平均值,用结构体输出它的编号。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 int s[1001],tot,n;
     7 double ans,m;
     8 struct Pd{
     9     int a,b;
    10 }d[1001];
    11 
    12 int cmp(const Pd &p,const Pd &q){
    13      if(p.b<q.b) return 1;
    14      else return 0;
    15 }
    16 
    17 int main()
    18 {
    19     cin>>m;
    20     n=(int)m;
    21     for(int i=1;i<=n;i++){
    22         /*d[i].a=d[i-1].a+1;*/
    23         d[i].a=i;
    24         cin>>d[i].b;
    25     }sort(d+1,d+n+1,cmp);
    26     for(int i=2;i<=n;i++){
    27         tot+=d[i-1].b;
    28         s[i]+=tot;
    29         ans+=s[i];
    30     }
    31     /*for(int i=1;i<=n;i++){
    32         for(int j=1;j<i;j++){
    33             ans+=d[j].b;
    34         }
    35     }*/
    36     for(int i=1;i<=n;i++){
    37         cout<<d[i].a<<" ";
    38     }cout<<endl;
    39     double w=ans/m;
    40     printf("%.2lf",w);
    41     return 0;
    42 }
     
  • 相关阅读:
    常用正则、正则表达式
    移动端虚拟手机键盘
    如何隐藏滚动条还能实现滚动的功能
    醉盏的第一篇博客-关于title的换行处理
    Mybatis-Generator自动生成Dao、Model、Mapping等相关映射文件(懒人版)
    java学习笔记----@Override的作用
    web项目生成web.xml的两种方式
    angular分页插件tm.pagination二次触发问题解决歪方案
    Ubuntu Server17.10配置静态IP
    cors 的深入细节
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/6748476.html
Copyright © 2020-2023  润新知