0
0
0
0
0
0
0
0
0
0
0
林炜曦
中级守护
中级守护
你的代码大致分析了每个人的等待时间,并进行了一定的优化。然而,你处在一个误区中,即认为优先满足时间较短的人的请求可以减少总等待时间。但这在有些情况下并不能得到最优解。你需要重新设计一个新的策略,让总的等待时间最短。你必须注意的是,每个人购票需要的时间都是不同的,而且一旦排在那个位置就不能改变。
这个问题实际上可以抽象为一个经典的排序问题,每个人都有一个值(购票需要的时间),我们可以基于这个值来为他们排序。然后将所有人的值相加得到总的等待时间。
让我**你的代码:
#include<iostream>
#include<cstdio>
#include<utility> // 用来实现pair数据结构
#include<algorithm> // 用来实现排序函数
using namespace std;
typedef pair<int,int>tp; // 定义了一个新类型pair,有两个整数型成员
tp a[1005]; // 定义了一个pair类型的数组,大小为1005
bool cmp(tp a,tp b){return a.first<b.first;} // 定义了一个比较函数,按照first从小到大排序
long long sum,cnt;
int main(){
long long n;
cin>>n;
for (int i=1;i<=n;i++){
scanf("%d",&a[i].first); //输入购票时间
a[i].second=i; //记录每个人的编号
}
sort(a+1,a+n+1,cmp); //根据购票时间排序, 这里错误,不应该按照first从小到大排序, 因为这样会导致时间久的在前面,总时间就会很大
for(int i=1;i<=n;i++){
sum+=a[i].first*(n-(i-1));
}
for (int i=1;i<=n;i++){
cout<<a[i].second<<" ";
}
printf("\n%.2lf",sum*1.0/n); // 计算并输出平均等待时间
return 0;
}
根据你的问题描述,我建议你进行如下修改:
- 需要正好相反,将花费时间多的人放到前面,这样平均等待时间就会最小。
- 尝试改变cmp函数,实现按照a.first从大到小排序的效果。
试着修改并运行你的代码,看看结果是否符合预期。如有问题,欢迎再次提问。
他脑有毛病
0
0
0
0