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