
2 1 1 3 1 1 1 2 1000000 1
1 0 0
题意:给你有n个数的栈,连续的6个数中有两个一样的数可以消除,一次只能消除两个,问最终这个栈的数能不能被消完。
题解:贪心。从头开始,每在6个里面找到两个一样的就消掉,再从头开始,用链表消除数比较方便。这样即使数据是1000个数,最多消500次,每次最多遍历的最后一个节点
也就是1000,寻找相同数遍历6个数,复杂度为n*n/2*6,即O(3*n*n).
#include <stdio.h>
#include <stdlib.h>
typedef struct T {
struct T * nxt;
int a;
} node;
node * head;
int main() {
int n,m,i,update,cnt;
node *cur,*nxt,*pre,*spre,*it;
head=(node *)malloc(sizeof(node));
while(~scanf("%d",&n)) {
m=n;
cur=head;
while(m--) {
nxt=(node *)malloc(sizeof(node));
scanf("%d",&nxt->a);
cur->nxt=nxt;
cur=nxt;
}
cur->nxt=NULL;
if(n%2) {
puts("0");
continue;
}
n/=2;
update=1;
while(update) {
update=0;
cur=head->nxt;
pre=head;
while(cur!=NULL) {
cnt=5;
nxt=cur;
while(cnt--) {
spre=nxt;
nxt=nxt->nxt;
if(nxt==NULL) break;
if(cur->a==nxt->a) {
update=1;
if(cnt==4) {
pre->nxt=nxt->nxt;
} else {
pre->nxt=cur->nxt;
spre->nxt=nxt->nxt;
}
free(cur);
free(nxt);
cur=pre;
break;
}
}
pre=cur;
cur=cur->nxt;
}
}
if(head->nxt==NULL)
puts("1");
else
puts("0");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/47477073