分组——洛谷

本文探讨了在洛谷竞赛中解决P4447问题时,从排序和连续数组理解到实际操作的转变。作者分享了初始的错误思路,即直接排序并寻找最短连续子数组,以及后来意识到需要遍历已建栈的优化策略。错误在于忽视了相同值元素的重要性,导致部分连续序列丢失。
摘要由CSDN通过智能技术生成

P4447 [AHOI2018初中组]分组 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 一开始看到这题,十分想当然的以为只要排个序,然后找到连续的最短的数组就行,然而事实证明我想简单了。。。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll a[N], s[N];
stack<int>st[N];

int main() {
	ll n, t = 0, min = (1 << 31) - 1;
	int c = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	sort(a, a + n);
	for (int i = 0; i < n; i++) {
		for (int j = t; j > 0; j--) {//遍历以前建过的栈
			if (st[j].top() + 1 == a[i]) {//如果和之前建立的某个栈中的数能连续起来,就放进去
				st[j].push(a[i]);
				c = 1;
				break;
			} else
				c = 0;
		}
		if (c == 0)
			st[++t].push(a[i]);//否则就重新建一个栈
	}
	for (int i = 1; i <= t; i++) {
		if (st[i].size() < min) {
			min = st[i].size();
		}
	}
	cout << min << endl;
	return 0;
}

分析:入栈条件--->st[i].top()+1==a[i];

重点:如果多个栈满足条件,应选择后建立的栈,因为后建立的栈元素少

第一次的错误代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
ll a[N], s[N];

int main() {
	ll n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	sort(a, a + n);
	ll l = 0, ans = 1;
	for (int i = 0; i < n; i++) {
		if (a[i + 1] - a[i] == 1)
			ans++;
		else {
			s[l++] = ans;
			ans = 1;
		}
	}
	sort(s, s + l);
	cout << s[0] << endl;

	return 0;
}

错因:如果遇到相同值的元素会直接跳过(被抛弃),后期也不会用,但是第一种方法则是会吧之前建的栈挨个遍历(防止相同元素被抛弃的情况)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值