问题标题: 酷町堂:1251 排队买票

2
0
已解决
张恩泽
张恩泽
高级天翼
高级天翼

1251   排队买票经验值:1200

题目描述 Description

春节将至,有N个人在一个火车票窗口前排队买票,一个人买完票了则离开,为使他们的等待时间最少,请找出这N个人排队的一种顺序。

输入描述 Input Description

第一行为N,第二行为这N个人的买票等待时间t,每个数之间有一个空格。(1=<N,t<=1000)

输出描述 Output Description

输出两行,第一行为排队的顺序,第二行为这种方案下的平均等待时间(保留两位小数)。如果两人等待时间相同,则按输入顺序排序,输入靠前的则排在前面。

样例输入 Sample Input

10 8 7 9 3 5 2 1 6 4 10

样例输出 Sample Output

7 6 4 9 5 8 2 1 3 10 22.00

数据范围及提示 Data Size & Hint

(当前买票人等待的时间*包括当前买票人在内的剩余人数)的累加和
如样例中第一位买票人等待的时间为1,剩余10人,则时间为1 * 10=10;第二位买票人等待的时间为2,剩余9人,则时间为2 * 9=18;。。。直到第十位买票人等待的时间为10,剩余1人,时间为10 * 1=10;将这些时间加起来再除以人数10为22.00。

张恩泽在2020-08-25 08:31:20追加了内容

0分代码:

//CODE
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
using namespace std;
struct ss
{
	int t,pos;
}a[10000];
bool cmp(ss x,ss y)
{
	if(x.t!=y.t)
		return x.t<y.t;
	return x.pos<y.pos;
}
int main()
{
	int n;
	double sum=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].t;
		a[i].pos=i;
	}
	sort(a+1,a+n+1,cmp);
	int c=n;
	for(int i=1;i<=n;i++)
	{
		cout<<a[i].pos<<" ";
		sum+=i*(c--);
	}
	cout<<endl;
	sum=sum*1.0/n;
	printf("%.2f",sum);
	return 0;//好习惯!
}

 


3
已采纳
李致远
李致远
高级光能
高级光能

你好!

这道题其实不难;

思路:

定义结构体,里面包含时间和编号

cmp函数:若x.时间!=y.时间 return x.时间<y.时间

return x.编号<y.编号

主函数

输入//注意编号需要手动赋值

sort

循环 cout a[i].编号  " ";

sum+=a[i].时间*当前数量(求项数,附图1.1)

保留两位,输出sum即可AC!//别忘了cstdio

————————————————————

//其实你自己应该可以推出来,或者说背出来。。。

望采纳,蟹蟹

0
0
0
蔡乐毅
蔡乐毅
高级光能
高级光能
  • struct s{
    • int num,cnt;
  • }a[1001];
  • bool cmp(s a,s b){
    • if(a.num!=b.num)     return a.num<b.num;
      • return a.cnt<b.cnt;
  • }
  • _ _ _ _ _
  • struct函数排序
0
黄子扬
黄子扬
初级天翼
初级天翼

直接按时间从小到大排序,不需要·结构体吧

0
0
我要回答