排队接水

【题目描述】

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

【输入】

共两行,第一行为n(1n1000);第二行分别表示第11个人到第n个人每人的接水时间T1T2Tn每个数据之间有11个空格。

【输出】

有两行,第一行为一种排队顺序,即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


做的第一个贪心题;
作为一名新来的蒟蒻,
本着虚心学习的态度
我还是负责任地说,
也就萌新适合看看我的题解了,
(比我更萌新的蒟蒻)
毕竟我写的还是比较简单易懂的
(我写的主要是记录我的足迹,相当于我的成长档案)
正所谓贪心,
就是用局部最优解,
得出全局最优解,
举个例子,
找规律,
我们找一部分的规律,
用这一部分,
找全部数的规律,
用局部最优解之和,
求得最优解,
就是贪心的主要思想,

这个题因为数越靠前,
计算的次数越多,
我们就可以排好序,
把最小的放在最前面,
这里引用一个sort排序
(需要<algorithm>库)
sort(a+1,a+1+n)
就是把a[1]~a[n]从小到大排好序,
sort排序速度还是很快的,
然后就好理解了;
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int n,m[1100]={0};
 7     double t[1100]={0},a[1100]={0},s[1100]={0},ans=0;
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i++)
10     {
11         scanf("%lf",&t[i]);
12         a[i]=t[i];
13     }
14     sort(t+1,t+n+1);
15     for(int i=1;i<=n;i++)
16         for(int j=1;j<=n;j++)
17             if(t[i]==a[j]&&m[j]==0)
18             {
19                 printf("%d ",j);
20                 m[j]=1;
21                 break;
22             }
23     printf("\n");
24     for(int i=1;i<n;i++)
25     {
26         s[i]=t[i]+s[i-1];
27         ans+=s[i];
28     }
29     printf("%0.2f",ans/n);
30     return 0;
31 }

每日坚持打卡O(∩_∩)O~

posted @ 2019-09-07 23:06  sshadows  阅读(305)  评论(0编辑  收藏  举报