上一页 1 ··· 48 49 50 51 52 53 54 55 56 ··· 85 下一页
  2011年12月28日
摘要: UVA_712 模拟题目所说的即可。#include<stdio.h>#include<string.h>#define MAXD 200int N, M, g[10], a[10];char b[10], d[MAXD];void solve(){ int i, j, k; for(i = 1; i <= N; i ++) { scanf("%s", b); sscanf(b + 1, "%d", &k); g[k] = i; } scanf("%s", d); scanf("%d&q 阅读全文
posted @ 2011-12-28 22:11 Staginner 阅读(206) 评论(0) 推荐(0) 编辑
  2011年12月27日
摘要: UVA_297 由于这个题目可以看成是完全四叉树,所以借用了一下线段树的思想,把题目转化成了对区间进行两次染色,然后求最后色块的个数。 当然我的程序写得复杂了,lazy可以不用的,在统计的时候遇到黑色节点就返回即可,只不过这样计数的方式就要稍加变化了。#include<stdio.h>#include<string.h>#define MAXD 4000int tree[MAXD], lazy[MAXD], cur, M, res;char b[1500];void down(int t){ if(lazy[t] == 1) { tree[t] = 1, lazy... 阅读全文
posted @ 2011-12-27 21:24 Staginner 阅读(289) 评论(0) 推荐(0) 编辑
摘要: UVA_548 直观的思路就是先把树建出来,然后再dfs,后来看了别人的解题报告之后发现其实可以不用建树的,因为建树的过程本身也是遍历树的一个过程,这样直接把该求的求出来就好了。 建树的核心思想是一棵子树后序遍历的最后一个值一定是根节点,这样再在中序遍历中找到根节点之后,就可以把这棵子树分成根节点、左子树、右子树这三部分了,继续按这个思想处理左右两棵子树即可完成建树的过程。#include<stdio.h>#include<string.h>#define MAXD 10010#define INF 0x3f3f3f3fint N, min, minv, value[M 阅读全文
posted @ 2011-12-27 20:12 Staginner 阅读(380) 评论(0) 推荐(0) 编辑
  2011年12月25日
摘要: SGU_109 一开始没有看到Ki是有范围限制的,于是构造了一个最简单的情况,先挪1步,然后把除左上角3个以外全删掉,然后再挪3步,除左上角外两个也删掉。返回的结果是PE,也着实让我困扰了一阵子。 虽然上面出错了,不过最基本的构造思想还是有了:①如果移动奇数步,那么只可能移到和当前格子的曼哈顿距离是奇数的位置,这样相当于把棋盘进行了黑白染色,奇数步只能走到异色的区域,偶数步只能走到同色的区域。②我们可以先让观众移动N步,然后用类似上面的办法,一点点把观众逼到左上角即可。#include<stdio.h>#include<string.h>int N;void solve 阅读全文
posted @ 2011-12-25 00:57 Staginner 阅读(404) 评论(0) 推荐(0) 编辑
  2011年12月24日
摘要: SGU_108 这个题目可以直接筛出来结果,但要注意几个问题:①数组不够大,但由于推断的时候前后影响的区间并不大,因此我们可以把数组循环使用,对数组操作的时候多加一个取模运算即可。②空间不允许我们先把所有结果都处理出来,因此我们可以在筛的过程中,标记一下当前筛出的是第几个数,如果是需要输出的,再存到指定位置去即可,这样只要开出K的空间来就可以了。③由于si可能是无序的,而我们在筛的过程中只能顺序找到,而我们又不能每次都花O(K)的时间去看看当前是不是要输出的,所以需要预先按si的值排下序,为了能够方便查找、更改,我们不能直接对si排序,但可以对si的标号按si的大小进行排序,同时还要注意si有 阅读全文
posted @ 2011-12-24 21:44 Staginner 阅读(559) 评论(0) 推荐(0) 编辑
摘要: SGU_106 这个题目AC了的程序也写的不尽相同,但就NOWCOW上面的那个C++程序来说,处理某些数据确实存在问题,所以最好还是写自己的思路了。 我的思路就是首先把一个基本解求出来,然后看在x1、x2的范围内x的范围是多少,然后找到对应的y的范围,再看y的范围有多少个解是在y1、y2范围之内的,这个就是最后的答案。 当然,对于含有a=0或b=0的情况要特判一下。#include<stdio.h>#include<string.h>long long int a, b, c, x1, x2, y1, y2;long long int abs(int x){ retur 阅读全文
posted @ 2011-12-24 17:19 Staginner 阅读(861) 评论(2) 推荐(0) 编辑
摘要: SGU_107 一开始没有什么想法,后来突然想到乘方的后9位是由这个数本身的后9位决定的,于是就先打印了一下9位数以内模10^9为987654321的值,发现只有8个9位数,也就是说当x的后9位为这8个数其一时,x就是符合要求的。#include<stdio.h>#include<string.h>int N;int main(){ int i; while(scanf("%d", &N) == 1) { if(N <= 8) printf("0\n"); else if(N == 9) printf(". 阅读全文
posted @ 2011-12-24 00:44 Staginner 阅读(269) 评论(0) 推荐(0) 编辑
  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 阅读(194) 评论(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 阅读(420) 评论(3) 推荐(0) 编辑
上一页 1 ··· 48 49 50 51 52 53 54 55 56 ··· 85 下一页