洛谷 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);
}
时间: 2024-10-25 16:40:16

洛谷 P1223 排队接水(贪心,桶排序)的相关文章

洛谷——P1223 排队接水

P1223 排队接水 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格. 输出格式: 输出文件有两行,第一行为一种排队顺序,即1到n的一种排列:第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位). 输入输出样例 输入样例#1: 复制 10 56 12

洛谷1223排队接水

题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别表示第1个人到第n个人每人的接水时间T1,T2,-,Tn,每个数据之间有1个空格. 输出格式: 输出文件有两行,第一行为一种排队顺序,即1到n的一种排列:第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位). 输入输出样例 输入样例#1: 10 56 12 1 99 1000 234

luogu P1223 排队接水 贪心

1 //这道题让我想起来班主任的名言,你上课耽误1分钟,大家40个人,就耽误了大家40分钟.一样的道理,越靠前的人耽误的人越多,所以让快的人尽量靠前. 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 struct dat 6 { 7 int id,tim; 8 friend bool operator < (dat a,dat b) 9 { 10 return a.tim < b.t

luogu P1223 排队接水 x

P1223 排队接水 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格. 输出格式: 输出文件有两行,第一行为一种排队顺序,即1到n的一种排列:第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位). 输入输出样例 输入样例#1: 10 56 12 1 9

luogu P1223 排队接水

P1223 排队接水 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别表示第1个人到第n个人每人的接水时间T1,T2,-,Tn,每个数据之间有1个空格. 输出格式: 输出文件有两行,第一行为一种排队顺序,即1到n的一种排列:第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位). 输入输出样例 输入样例#1: 10 56 12 1 9

洛谷P1080 国王游戏 高精度 贪心 数学推公式

洛谷P1080 国王游戏        数学推公式      高精度    贪心 然而这并不是我打出来的,抄题解... 将左手与右手的乘积从小到大排序,然后计算求最大值即可.(需要高精度) 证明: 1)知道,如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人 2)假设相邻的两个人i, i + 1.设A[i] B[i] <= A[i + 1] B[i + 1],i之前所有人的左手乘积为S. 则,ans1 = max{S / B[i], S * A[i] / B[i + 1]} 若交换

D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]

题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个问题: 数轴上有个点突然兴奋,如果自己被身上覆盖了超过条线段,这个点就会浑身难受然后把Koishi批判一番. Koishi十分善良,为了不让数轴上的点浑身难受,也为了让自己开心,她想在数轴上放入尽量多的线段. 按照套路,Koishi假装自己并不会做这道题,所以她就来求你帮忙.并承诺如果你解决了问题就

洛谷P1016 旅行家的预算 贪心

这道题就是贪心 1.在第一个加油站的时候,如果在加满油能够到达的加油站中有一个加油站的钱比自己的少(其实等于也行),那就 加足够到那个车站的油,直接去那个车站2.这些车站中所有都比自己大,那就找一个其中钱最少的车站 在当前车站加满油,然后直接开到那个车站 3.然后到达车站时就不断重复以上的处理方法4.但这样有一个问题就是你无法到达最后一个车站,于是我们把最后一个车站的费用变为0(其实还是-1更保险)这样就保证如果能到,就一定能走到最后一个车站5.那么如何判断能否到达呢?如果在一次加油站处理操作时

洛谷.2325.[SCOI2005]王室联邦(贪心)

题目链接 比较水的题 然而.. 首先可以考虑DFS 每B个分一个块,但是这样链底不会和上边相连 于是考虑从底下开始分,即在DFS完一个点时才将其加入栈中:当子树size==B时出栈 最后在根节点可能会剩下一些未分配的点,这些点数当然<B(算上根节点<=B),分给上块就好了 感觉那么..这才2B.. #include <cstdio> #include <cctype> #define gc() getchar() const int N=1005; int n,B,En