2011年12月23日
摘要: SGU_105 看了别人的解题报告之后就恍然大悟了,我们不妨设第i项是a[i],另外补一个a[0]=0,于是有a[i]%3=(a[i-1]*10^x+i)%3=a[i-1]%3+i%3,然后我们再把i%3列成一个表就会发现是1,2,0,1,2,0…,这样的一个循环,于是我们就很容易发现每三项中的后两项能被三整除。#include<stdio.h>#include<string.h>int N;int main(){ while(scanf("%d", &N) == 1) printf("%d\n", (N - 1) / 3 阅读全文
posted @ 2011-12-23 21:06 Staginner 阅读(195) 评论(0) 推荐(0) 编辑
摘要: UVA_519 一开始裸的回溯,超时,后来想到了一些预判断,但还是超时了,看了UVA论坛上一个人发帖说预判断也没能saving他,于是我险些放弃了继续仔细想预判断的想法。 后来去W.C.的时候想到了更细化的预判断,出来之后又按这个思路继续想,于是得到了更多更细化的预判断,最终AC了,感觉细致的预判断是很强的剪枝呀。 我在预判断的时候主要考虑了下面几点: ①从全局角度讲,IO个数应该相等。 ②所有的F的个数应是2*(M+N),但这样还不够细致,我们仔细想一下不难得到下面这个更细致的条件,top和bottom中F的个数分别为M,left和right中F的个数分别为N。 ③受讨论②时把四... 阅读全文
posted @ 2011-12-23 16:58 Staginner 阅读(564) 评论(0) 推荐(0) 编辑
摘要: UVA_387 由于是精确覆盖问题,所以可以用Dancing Links去解决,只是需要把每个拼图按摆放位置的不同分成若干个拼图,但这些拼图都属于一类的,这一点要在Dancing Links的列中体现出来。#include<stdio.h>#include<string.h>#define MAXM 6#define INF 0x3f3f3f3fconst int MAXN = 6 * 6;const int MAXD = 6 * 6 * 6 * (6 * 6 + 6) + 6 * 6 + 6;char b[MAXM];int N = 4, M, ans[MAXM][M 阅读全文
posted @ 2011-12-23 01:29 Staginner 阅读(421) 评论(3) 推荐(0) 编辑