社区讨论
求助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 条回复,欢迎继续交流。
正在加载回复...