zoukankan      html  css  js  c++  java
  • 排队接水

    题目描述

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

    输入输出格式

    输入格式:

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

     输出格式:

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

    输入输出样例

    输入样例

    10 
    56 12 1 99 1000 234 33 55 99 812

    输出样例

    3 2 7 8 1 4 9 6 10 5
    291.90

    题中说是使 n 个人的平均等待时间最小,即等待时间总和最小。那么我们只要贪心的让每一个人的等待时间最小。而每一个人的等待时间,就是排在他前面的人的接水时间,所以只用让接水时间小的人排在前面接水。发现了只一点,这道题就迎刃而解了。

    顺便一提,记录顺序的话可以开一个结构体,里面有 num (每个人的序号)和 wat (每人接水时间),排序的时候按接水时间从大到小排就行。

    水一把代码

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 typedef long long ll;
     8 const int maxn = 10005;
     9 int n;
    10 ll tot = 0, sum = 0;
    11 struct peo
    12 {
    13     int num, wat;
    14     bool operator < (const peo& other)const
    15     {
    16         return wat < other.wat; 
    17     } 
    18 }a[maxn];
    19 void init(int n)
    20 {
    21     for(int i = 1; i <= n; ++i) a[i].num = i;
    22     return;
    23 }
    24 int main()
    25 {
    26     scanf("%d", &n);
    27     init(n);
    28     for(int i = 1; i <= n; ++i) scanf("%d", &a[i].wat);
    29     sort(a + 1, a + n + 1);
    30     for(int i = 1; i < n; ++i)
    31     {
    32         tot += a[i].wat;
    33         sum += tot;
    34     }
    35     for(int i = 1; i <= n; ++i) printf("%d ", a[i].num);
    36     printf("
    ");
    37     printf("%.2lf", (double)sum / n);
    38     return 0;
    39 }

    此题较水。。

  • 相关阅读:
    内嵌补丁(洞穴代码)
    攻防世界--game
    攻防世界--re1
    upx压缩notepad.exe(运行时压缩)
    crack Tut.ReverseMe1.exe
    HBuilder创建app 基础
    MongoDB 之pymongodb
    MongoDB 基础
    flask POOL,websocket握手
    flask flask_session,WTForms
  • 原文地址:https://www.cnblogs.com/mrclr/p/8340282.html
Copyright © 2011-2022 走看看