社区讨论

求助DALAO

P1155[NOIP 2008 提高组] 双栈排序参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi6zgpyv
此快照首次捕获于
2025/11/20 13:20
4 个月前
此快照最后确认于
2025/11/20 13:20
4 个月前
查看原帖
为什么我的22行循环进不去???
CPP
#include<cstdio>
#include<iostream>
using namespace std;
const int size = 1005;
const int inf = 1e9;

int s1[size], s2[size], tops1, tops2, k;
int num[size], n, y;
char ans[size * 2];
int x;
inline bool check(int pos) {
	/* 如果选择将num[y]放入s1,那么:
		找出当前输入序列中第一个大于num[y]并且大于s2的栈顶的元素
		如果进行到这个元素时仍使其可行,那么num[y]一定已经弹出了
		而这个元素之前的元素被放在了s1,因为满足单调栈的原则
		如果这个元素后面还有比num[y]小的,
		在经过上面操作后无论怎样也不可能被输出到num[y]前面它应该在的位置上,
		经过这个判断可以令贪心算法达到一定的正确可能性。
	*/
	if(!tops2) return true;
	int Find;
	printf("%d\n", pos);
	for(int i = pos + 1;i <= n;i++) {
		printf("%d %d\n", Find, i);
		Find = i;
		if(num[i] > num[pos] && num[i] > s2[tops2]) {
			break;
		}
	}
	for(int j = Find + 1;j <= n;j++) {
		if(num[j] < num[pos]) {
			return false;
		}
	}
	printf("CHECK : %d -> %d\n", pos, Find);
	return true;
}

int main() {
	int n;
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) {
		scanf("%d", &num[i]);
	}
	s1[0] = s2[0] = inf, k = 1, y = 1;
	tops1 = tops2 = 0;
	for(int i = 1;i <= n * 2;i++) {
		if(s1[tops1] == k) {
			tops1--, k++;
			ans[++x] = 'b';
			continue;
		}
		if(s2[tops2] == k) {
			tops2--, k++;
			ans[++x] = 'd';
			continue;
		}
		if(y <= n && num[y] < s1[tops1] && check(y)) {
			s1[++tops1] = num[y++];
			ans[++x] = 'a';
			continue;
		}
		if(y <= n && num[y] < s2[tops2]) {
			s2[++tops2] = num[y++];
			ans[++x] = 'c';
			continue;
		}
		printf("IN %d : 0\n", i);
		for(int i = 1;i <= tops1;i++) {
			printf("%d ", s1[i]);
		}
		printf("\n");
		for(int i = 1;i <= tops2;i++) {
			printf("%d ", s2[i]);
		}
		printf("\n");
		return 0;
	}
	for(int i = 1;i <= n * 2;i++) {
		printf("%c ", ans[i]);
	}
	printf("\n");
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...