记录此题提醒自己,有些模拟题不需要想的太复杂,直接模拟找答案分界点即可。
问题陈述
有一项考试的结构如下。
- 考试由 N N N 轮组成,称为 1 1 1 至 N N N 轮。
- 在每轮考试中,你都会得到一个介于 0 0 0 和 100 100 100 之间的整数分数。
- 你的最终成绩是除去最高分和最低分的各轮分数之和
N
−
2
N-2
N−2 。
- 形式上,假设 S = ( S 1 , S 2 , … , S N ) S=(S_1,S_2,\dots,S_N) S=(S1,S2,…,SN) 是按升序排序的各轮所得分数的序列,那么最终成绩就是 S 2 + S 3 + ⋯ + S N − 1 S_2+S_3+\dots+S_{N-1} S2+S3+⋯+SN−1 。
现在,
N
−
1
N-1
N−1 轮考试已经结束,你在
i
i
i 轮考试中的得分是
A
i
A_i
Ai 。
请打印您在第
N
N
N 轮考试中必须获得的最低分数,以获得
X
X
X 或更高的最终成绩。
如果无论您在第
N
N
N 轮获得多少分数,您的最终成绩都不会达到
X
X
X 或更高,则打印"-1"。
请注意,您在第
N
N
N 轮的得分只能是介于
0
0
0 和
100
100
100 之间的整数。
限制因素
- 所有输入值均为整数。
- 3 ≤ N ≤ 100 3 \le N \le 100 3≤N≤100
- 0 ≤ X ≤ 100 × ( N − 2 ) 0 \le X \le 100 \times (N-2) 0≤X≤100×(N−2)
- 0 ≤ A i ≤ 100 0 \le A_i \le 100 0≤Ai≤100
输入
输入内容由标准输入法提供,格式如下
N X
A1 A2 ... A{N-1}
输出
打印答案
如果这题你想着直接去用一堆if
去做那你就废了,因为这样难想到爆了。
其实仅仅需要枚举最后一个值你能取的值就行了,因为分数的限制是 0 0 0 到 100 100 100,所以直接枚举 0 0 0 到 100 100 100,看看哪个数能够满足要求直接输出。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int N = 110;
int a[N];
int main() {
int n, m; cin >> n >> m;
int sum = 0;
int MAX = -1, MIN = 1e9;
for (int i = 1; i <= n - 1; i++) {
cin >> a[i];
sum += a[i];
MAX = max(MAX, a[i]);
MIN = min(MIN, a[i]);
}
int mm;
int MM;
int t;
for (int i = 0; i <= 100; i++) {//直接枚举分数
t = sum,mm = MIN, MM = MAX;
t += i;
mm = min(mm, i);
MM = max(MM, i);
t -= mm + MM;
if (t >= m) {
cout << i; return 0;
}
}
cout << -1 << endl;
return 0;
}