题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为t[i],请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。 注意:若两个人的等待时间相同,则序号小的优先。 输入 第一行为n。 第二行到最后一行中,共有n个整数, 分别表示第一个人到第n个人每人的接水时间t[1],t[2],t[3],t[4],……t[n],每个数据之间有一个空格或换行。 数据范围: 0<n<=900, 0<t<=1000 输出 共两行,第一行为一种排队顺序,即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
这里遇到了一点问题,就是写程序的 有 报错 而且 比较麻烦的是 看不懂报错 ..下面附上错误提示.
F:程序asd.cpp(15) : error C2109: subscript requires array or pointer type F:程序asd.cpp(15) : error C2228: left of '.s' must have class/struct/union type
出现这个错误的 原因是 定义了 a的结构体有定义了a的整形.
#include<stdio.h> #include<algorithm> using namespace std; struct ss { int s,r; }a[1111]; bool cmp(ss a,ss b) { return a.s<b.s; //这是稳定的 排序 因为 他不是 小于等于.. } int main() { int s,i,j,m,n,b,c; double sum; while(scanf("%d",&n)!=EOF) { s=sum=0; for(i=1;i<=n;i++) { scanf("%d",&a[i].s); a[i].r=i; } sort(a,a+n+1,cmp); //思考一下 不同的 对不同类型的 排序.里面传送们的值不同之处.为什么都是这样传送的. //知道了 a 是首地址 a+n是尾地址 因为在上面是从 a[1] 开始所以这里需要+1. for(i=1;i<n;i++) { printf("%d ",a[i].r); //s=s+a[i].s; //sum=sum+s; } for (int i=1;i<=n;i++) sum=sum+a[i].s*(n-i); sum=sum/n; printf("%d %.2lf ",a[n].r,sum); } }