HDU 2095 find your present (2) 动态链表
2013-08-14 21:32
363 查看
解题报告:输入一个n,后面紧跟着输入n个数,输入的这n个数中,除了有一个数的个数为奇数外,其它的数的个数都是偶数个,现在要你找出这个个数为奇数的这个数。
看起来好像很简单的样子,不过,这题的重点不在这里,看下内存限制就知道了,只有1024KB,也就是1M,而n的范围是1000000,输入的数的范围更是在int以内,所以这题其实考的就是一个内存优化的问题。当然,这让我们很自然的联想到中数据结构-动态链表,要多少分配多少,这样就可以最大限度的减少不必要的内存消耗。很久没写动态链表了,竟然调试了很久。不过在discuss里面看到有位神牛的做法,顿时就感觉弱爆了,他的代码只有几行,原理就是利用C语言里面的 ^ (异或)运算,内存竟然只用了240KB,而我用动态链表写的内存用了280KB,还有用动态链表写一定要记得在删除节点的时候把那块内存删除,要不然还是过不过了,不过只超出40KB了。
View Code
看起来好像很简单的样子,不过,这题的重点不在这里,看下内存限制就知道了,只有1024KB,也就是1M,而n的范围是1000000,输入的数的范围更是在int以内,所以这题其实考的就是一个内存优化的问题。当然,这让我们很自然的联想到中数据结构-动态链表,要多少分配多少,这样就可以最大限度的减少不必要的内存消耗。很久没写动态链表了,竟然调试了很久。不过在discuss里面看到有位神牛的做法,顿时就感觉弱爆了,他的代码只有几行,原理就是利用C语言里面的 ^ (异或)运算,内存竟然只用了240KB,而我用动态链表写的内存用了280KB,还有用动态链表写一定要记得在删除节点的时候把那块内存删除,要不然还是过不过了,不过只超出40KB了。
#include<cstdio> struct node { int x; node *next; }; void insert(node *head,int d) { node *p = head; while(p->next != NULL) { if(p->next->x == d) { node *m = p->next; p->next = p->next->next; delete m; return ; } p = p->next; } node *q = new node; q->x = d; q->next = NULL; p->next = q; } int main() { int n,d; while(scanf("%d",&n),n) { node *head = new node; head->x = -1; head->next = NULL; while(n--) { scanf("%d",&d); insert(head,d); } printf("%d\n",head->next->x); } return 0; }
View Code
相关文章推荐
- hdu 2095 find your present (2)
- hdu 2095 find your present (2)
- HDU 2095 find your present (2) 异或的经典运用
- hdu - 2095 - find your present (2)(异或)
- hdu 2095 find your present (2)
- HDU 2095 find your present(异或)
- HDU-2095 find your present (2) 按位异或求解
- HDU 2095 find your present (2) 异或
- HDU 2095 find your present (2) 【异或】
- hdu 2095 find your present (2)
- HDU 2095 find your present (2)
- hdu 2095 find your present (2)
- HDU_2095 find your present (2)
- HDU 2095 find your present (2)
- HDU 2095 find your present
- hdu 2095 find your present (2)(位异或)
- hdu_2095 find your present (2)
- hdu 2095 find your present (2)
- hdu 2095 find your present (2)
- HDU 2095 - find your present (2)