洛谷 试炼场 P1233 排队接水 (排序,贪心)

一道水题。。。。

链接: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不重复

分析:

题目很水,大概意思就是一群人去接水,有的人要的时间多,而有的人要的时间少,问怎样排队平均等待时间最少?

那我们知道总的等待时间是第一个时间加到最后一个人,所以要让时间少的先打,总的等待时间最少。

代码:

 1 #include<bits/stdc++.h>                           //c++万能头文件
 2 using namespace std;
 3 struct sb{
 4     int a;
 5     int id;
 6 }s[10086];
 7 int cmp(sb a1,sb a2){
 8     if(a1.a>a2.a) return 0;
 9     if(a1.a<a2.a) return 1;
10 }                                                                 //因为用了struct所以要定义怎样排序
11 int main(){
12     int n;
13     double z;
14     cin>>n;
15     for(int i=1;i<=n;i++){
16         cin>>s[i].a;                            //输入接水所用时间
17         s[i].id=i;                               //给当前接水人的的编号
18     }
19     sort(s+1,s+n+1,cmp);
20     for(int i=1;i<=n;i++){
21         cout<<s[i].id<<" ";                //输出接水的顺序
22         z=z+s[i].a*(n-i);                    //计算总时间
23     }
24     printf("\n%.2f",z/n);                            //输入平均时间
25     return 0;
26 }
时间: 2024-08-06 07:57:57

洛谷 试炼场 P1233 排队接水 (排序,贪心)的相关文章

洛谷 P1223 排队接水(贪心,桶排序)

此题为洛谷普及试炼场的一道水题.... 题目链接:https://www.luogu.org/problem/show?pid=1223 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小. 输入输出格式 输入格式: 输入文件共两行,第一行为n:第二行分别表示第1个人到第n个人每人的接水时间T1,T2,-,Tn,每个数据之间有1个空格. 输出格式: 输出文件有两行,第一行为一种排队顺序,即1到n的一种排列:第二行为

【洛谷试炼场】【模拟专题】P1012 拼数

[题目描述] 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613 [输入格式] 第一行,一个正整数n. 第二行,n个正整数. [输出格式] 一个正整数,表示最大的整数 [输入样例#1] 3 13 312 343 [输出样例#1]34331213 本题思路: 水题.用字符串存储 一个自定义排序搞定:两个字符串在 正着方

洛谷试炼场 普及常见模板

对没错我就是在水博 P3366 [模板]最小生成树 kruskal: P3367 [模板]并查集 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=210000; 9 int read()

洛谷 P1966 火柴排队

题面 先研究第一个问题:如何使得"距离"最小. 可以发现题意就是要求一种合适的两组数间的配对方式,使得∑(ai-bi)^2最小. 我口胡了一个结论...就是最好的配对方式,就是两组数分别排好序后,将位置相同的两个元素配对. 当然,可以发现这个结论是对的:https://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P1966 (以下内容仅为记录)题目的意思:min{∑(ai-bi)^2 (1<=i<=n)}展开:min{∑(

洛谷P3809 【模板】后缀排序

题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的位置.位置编号为 11 到 nn . 输入输出格式 输入格式: 一行一个长度为 nn 的仅包含大小写英文字母或数字的字符串. 输出格式: 一行,共n个整数,表示答案. 输入输出样例 输入样例#1: 复制 ababa 输出样例#1: 复制 5 3 1 4 2 说明 n <= 10^6n<=106 更新了一下自己

洛谷P1966 火柴排队[NOIP提高组2013]

我确信我应该是做过这道题……就当再写一遍好了. 贪心思想,一番证明得出a和b数组中最小对最小,次小对次小……时解最优.那么先处理出a,b之间的对应关系,然后按照该关系求a或者b的逆序对数量就是答案 1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using n

洛谷——P1966 火柴排队

https://www.luogu.org/problem/show?pid=1966 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度. 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小.请问得到这个最小的距离,最少需要交换多少次?如果这个

洛谷试炼场 提高模板-nlogn数据结构

树状数组-区间求和 P3374 [模板]树状数组 1 1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 int read(){ 9 int x=0,f=1;char ch=getchar(); 10 while(ch

洛谷 P1966 火柴排队 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1966 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示第一列火柴中第 i 个火柴的高度,bi 表示第二列火柴中第 i 个火柴的高度. 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换