狂暴的老师(rage)
【题目背景】
有 n 个同学(从 0 开始编号)在学习启发式的信奥课,同学们排队向老师提问。每 个同学问的问题不同,因此答疑时长不同,设第 i 个同学的答疑时长为 ti;每个同学的 耐心值也不同,设第 i 个同学的耐心为 pi。 如果一个同学等待太久,他会暴躁。每个同学的暴躁程度 gi 等于排在他前面的同 学的答疑时长之和与自身耐心的差值,即:gi = t0 + t1 +···+ ti−1 −pi。 如果同学们很暴躁,老师会狂暴。老师的狂暴程度 r 等于所有同学暴躁程度 gi 的 最大值,即:r = maxn−1 i=0 gi。 改变 n 个同学的排队顺序,老师的狂暴程度可能会发生变化。求所有的排队顺序 中,老师的狂暴程度的最小值 minr。
【输入格式】
从标准输入读入数据。 第一行为一个正整数 n(1≤n≤1,000),表示有 n 位同学。 第二行到第 n+1 行,每行两个整数,分别是 ti(0≤ti ≤1,000)和 pi(0≤ pi ≤1,000)。
【输出格式】
输出到标准输出。 输出共一行,表示老师狂暴程度 r 的最小值。
【样例 1 输入】
3
5 1
1 4
2 2
【样例 1 输出】
2
求C++代码,在线等
另外,我用人格担保,回答了正确了肯定是要采纳的
各位大佬求救救
#include <iostream>
#include <stdlib.h>
using namespace std;
int minr;
int * p;
int * t;
int calc(int * seed, int sn)
{
int mr = 0;
int pt = 0;
for (int i = 0; i < sn; i++)
{
if (mr < p[seed[i]] * pt) mr = pt - p[seed[i]];
pt += t[seed[i]];
}
return mr;
}
void arrange(int * seed, int sn, int n)
{
if (sn == n)
{
int mr = calc(seed, sn);
if (mr < minr) minr = mr;
return;
}
for (int i = 0; i < n; i++)
{
int used = 0;
for (int j = 0; j < sn; j++)
{
if (seed[j] == i)
{
used = 1;
break;
}
}
if (!used && calc(seed, sn) < minr)
{
int * seed1 = new int[n];
memcpy(seed1, seed, sizeof(int) * sn);
seed1[sn] = i;
arrange(seed1, sn + 1, n);
delete[] seed1;
}
}
}
int main()
{
minr = 0x7fffffff;
int n;
cin >> n;
p = new int[n];
t = new int[n];
for (int i = 0; i < n; i++)
{
cin >> t[i];
cin >> p[i];
}
int * seed = new int[n];
arrange(seed, 0, n);
delete[] seed;
delete[] p;
delete[] t;
cout << minr;
return 0;
}