P1223 排队接水/1319:【例6.1】排队接水
# 排队接水
## 题目描述
有 $n$ 个人在一个水龙头前排队接水,假如每个人接水的时间为 $T_i$,请编程找出这 $n$ 个人排队的一种顺序,使得 $n$ 个人的平均等待时间最小。
## 输入格式
第一行为一个整数 $n$。
第二行 $n$ 个整数,第 $i$ 个整数 $T_i$ 表示第 $i$ 个人的等待时间 $T_i$。
## 输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
## 样例 #1
### 样例输入 #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 \leq 1000,t_i \leq 10^6$,不保证 $t_i$ 不重复。
当 $t_i$ 重复时,按照输入顺序即可(sort 是可以的)
【俩81分代码】
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1e3;
inline int fread()
{
char ch=getchar();
int n=0,m=1;
while(ch<'0' or ch>'9')
{
if(ch=='-')m=-1;
ch=getchar();
}
while(ch>='0' and ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();
return n*m;
}
int n,a[N],t[N];
double cnt,sum;
void sort()
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(t[i]>t[j])swap(t[i],t[j]),swap(a[i],a[j]);
}
signed main()
{
n=fread();
for(int i=1;i<=n;i++)t[i]=fread(),a[i]=i;
sort();
for(int i=1;i<=n;i++)cnt+=t[i]*(n-(i-1)),sum+=t[i];
for(int i=1;i<=n;i++)printf("%d ",a[i]);
printf("\n%.2lf",(cnt-sum)/n);
return 0;
}
数组开小了。

#include<stdio.h>
#include<iostream>
using namespace std;
#define int long long
const int N=1e3;
inline int fread()
{
char ch=getchar();
int n=0,m=1;
while(ch<'0' or ch>'9')
{
if(ch=='-')m=-1;
ch=getchar();
}
while(ch>='0' and ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();
return n*m;
}
int n,a[N],t[N];
double cnt,sum;
void sort()
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(t[i]>t[j])swap(t[i],t[j]),swap(a[i],a[j]);
}
signed main()
{
n=fread();
for(int i=1;i<=n;i++)t[i]=fread(),a[i]=i;
sort();
for(int i=1;i<=n;i++)cnt+=t[i]*(n-(i-1)),sum+=t[i];
for(int i=1;i<=n;i++)printf("%d ",a[i]);
printf("\n%.2lf",(cnt-sum)/n);
return 0;
}

【AC代码】
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1e4;
inline int fread()
{
char ch=getchar();
int n=0,m=1;
while(ch<'0' or ch>'9')
{
if(ch=='-')m=-1;
ch=getchar();
}
while(ch>='0' and ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();
return n*m;
}
int n,a[N],t[N];
double cnt,sum;
void sort()
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(t[i]>t[j])swap(t[i],t[j]),swap(a[i],a[j]);
}
signed main()
{
n=fread();
for(int i=1;i<=n;i++)t[i]=fread(),a[i]=i;
sort();
for(int i=1;i<=n;i++)cnt+=t[i]*(n-(i-1)),sum+=t[i];
for(int i=1;i<=n;i++)printf("%d ",a[i]);
printf("\n%.2lf",(cnt-sum)/n);
return 0;
}

【一堆运行超时代码】
#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1e4;
inline int fread()
{
char ch=getchar();
int n=0,m=1;
while(ch<'0' or ch>'9')
{
if(ch=='-')m=-1;
ch=getchar();
}
while(ch>='0' and ch<='9')n=(n<<3)+(n<<1)+ch-48,ch=getchar();
return n*m;
}
int n,a[N],t[N];
double cnt,sum;
void sort()
{
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(t[i]>t[j])swap(t[i],t[j]),swap(a[i],a[j]);
}
signed main()
{
n=fread();
for(int i=1;i<=n;i++)t[i]=fread(),a[i]=i;
sort();
for(int i=1;i<=n;i++)cnt+=t[i]*(n-(i-1)),sum+=t[i];
for(int i=1;i<=n;i++)printf("%d ",a[i]);
printf("\n%.2lf",(cnt-sum)/n);
return 0;
}

#include<stdio.h>
#include<iostream>
using namespace std;
const int N=1e4;
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#