H Bsq AK ZUCCPC

博客介绍了如何使用贪心算法解决一个竞赛题目,该题目涉及计算在不同条件下做对和做错题目的人数。首先计算最大值,即数组中的最小值。然后计算最小值,通过模拟不同情况,确定可以达到全对或全错的最少题目数量,过程中涉及到数组遍历和重叠部分的处理。作者发现这种方法颇为巧妙。
摘要由CSDN通过智能技术生成

https://ac.nowcoder.com/acm/contest/9934/H

题解说是用贪心,然后我没用?
AK和爆0算范围都是一样的,总人数-做对的人数=做错的人数。
首先算最大值,这个比较简单,就是数组中的最小值。
然后再算最小值,这个可以想成不同种的天气,例如1-3下雨,2-4下雪,只有重合的2-3才会既下雪又下雨,也就是说2-3才是有用的部分,其他的部分你再来任何天气也实现不了全下(全不下)。所以方法就是对数组遍历一遍,从第二个开始,如果和小于总人数,就说明放得下(可以做到不重叠),大于总人数的话我们就只留下重合的部分,其余的丢掉,也就是和-总人数,然后继续…
感觉这样做还挺神奇的?

#include <bits/stdc++.h>
using namespace std;
long long a[10001], b[100001];
const int N = 1e9 + 1;

int main() {
	int t;
	int n, m;
	cin >> t;
	while (t--) {
		long long l1 = 0, r1 = N;
		long long l2 = 0, r2 = N;
		cin >> n >> m;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
			b[i] = m - a[i];
			l1 += a[i];
			l2 += b[i];
			r1 = min(r1, a[i]);
			r2 = min(r2, b[i]);
			if (i > 1) {
				if (l1 <= m)
					l1 = 0;
				else
					l1 -= m;
				if (l2 <= m)
					l2 = 0;
				else
					l2 -= m;
			}
		}
		cout << l1 << ' ' << r1 << endl;
		cout << l2 << ' ' << r2 << endl;
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值