简单的 贪心 接水问题

题目描述
有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);
    }
}
原文地址:https://www.cnblogs.com/A-FM/p/5155753.html