排队接水
【题目描述】
有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。
【输入】
共两行,第一行为n(1≤n≤1000);第二行分别表示第11个人到第n个人每人的接水时间T1,T2,…,Tn每个数据之间有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~
看不见我看不见我看不见我