AtCoder Beginner Contest 321 - B - Cutoff (EASY,模拟)

记录此题提醒自己,有些模拟题不需要想的太复杂,直接模拟找答案分界点即可。

问题陈述

有一项考试的结构如下。

  • 考试由 N N N 轮组成,称为 1 1 1 N N N 轮。
  • 在每轮考试中,你都会得到一个介于 0 0 0 100 100 100 之间的整数分数。
  • 你的最终成绩是除去最高分和最低分的各轮分数之和 N − 2 N-2 N2
    • 形式上,假设 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++SN1

现在, N − 1 N-1 N1 轮考试已经结束,你在 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 3N100
  • 0 ≤ X ≤ 100 × ( N − 2 ) 0 \le X \le 100 \times (N-2) 0X100×(N2)
  • 0 ≤ A i ≤ 100 0 \le A_i \le 100 0Ai100

输入

输入内容由标准输入法提供,格式如下

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;
}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值