C++ 代码解决学生排队问题:最小化老师狂暴程度
C++ 代码解决学生排队问题:最小化老师狂暴程度
问题描述:
有 $n$ 个学生需要排队,每个学生有两个属性:到达时间 $t$ 和耐心值 $p$。老师的狂暴程度与相邻两个学生之间耐心值差的绝对值有关。目标是找到一种排队顺序,使老师狂暴程度最小。
输入格式:
从标准输入读入数据。 第一行为一个正整数 $n$($1 \le n \le 1,000$),表示有 $n$ 位同学。 第二行到第 $n+1$ 行,每行两个整数,分别是 $t_i$($0 \le t_i \le 1,000$)和 $p_i$($0 \le p_i \le 1,000$)。
输出格式:
输出到标准输出。 输出共一行,表示老师狂暴程度 $r$ 的最小值。
样例 #1
样例输入 #1
3
5 1
1 4
2 2
样例输出 #1
2
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct st{
int t,p;
}a[1001];
bool cmp(st x,st y){
return x.t<y.t;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].t>>a[i].p;
sort(a+1,a+n+1,cmp);
int ans=2147483647;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(a[j].p-a[i].p>=0)
ans=min(ans,a[j].t-a[i].t);
cout<<ans<<endl;
return 0;
}
代码解析:
- 首先定义一个结构体
st,用于存储每个学生的到达时间 $t$ 和耐心值 $p$。 - 定义一个数组
a,用于存储所有学生的结构体信息。 - 定义一个函数
cmp,用于比较两个学生的到达时间,按照到达时间升序排序。 - 读取输入,并将学生信息存储到数组
a中。 - 使用
sort函数,按照到达时间升序排序学生。 - 定义一个变量
ans,用于存储老师狂暴程度的最小值,并初始化为最大值2147483647。 - 使用两层循环遍历所有学生,对于每对学生,计算其耐心值差的绝对值,并更新
ans的值,即取最小值。 - 输出
ans的值,即老师狂暴程度的最小值。
代码的思路是:
- 首先将学生按照到达时间升序排序,这样可以保证学生按到达时间依次排队。
- 然后遍历所有学生,对于每对学生,计算其耐心值差的绝对值,并更新老师狂暴程度的最小值。
- 由于老师狂暴程度与相邻两个学生之间耐心值差的绝对值有关,因此只需要考虑相邻的学生即可。
总结:
这段 C++ 代码有效地解决了学生排队问题,并找到了使老师狂暴程度最小化的排队顺序。代码结构清晰,逻辑简洁,可读性强。
原文地址: https://www.cveoy.top/t/topic/n3pD 著作权归作者所有。请勿转载和采集!