2012年5月3日
摘要: URAL_1036 用f[i][j]表示递推到第i位时数字和为j的方案数,最后用下乘法原理f[N][S/2]*f[N][S/2]就是最后结果。 由于结果比较大,所以需要高精度。import java.math.BigInteger;import java.util.Scanner;public class Main { static int N, S; static BigInteger[][] f = new BigInteger[60][510]; public static void main(String[] args) { Scanner cin ... 阅读全文
posted @ 2012-05-03 21:19 Staginner 阅读(707) 评论(0) 推荐(0)
摘要: URAL_1034 和经典的N皇后问题很相似,尽管N比较大,但由于只重新安排3个皇后有C(N,3)种情况,每个皇后至多有3个位置可以放,所以最大也就是有C(50,3)*3^3种情况。 位运算版的N皇后问题详见Matrix67的博客:http://www.matrix67.com/blog/archives/266。#include<stdio.h>#include<string.h>#define MAXD 60int N, cnt, visr[MAXD], visc[MAXD], vis[MAXD][MAXD];struct Point{ int x, y;}p[MA 阅读全文
posted @ 2012-05-03 16:20 Staginner 阅读(327) 评论(0) 推荐(0)
摘要: URAL_1033 要注意下两个entrance不一定是连通的,然后用dfs计数就可以了。#include<stdio.h>#include<string.h>#define MAXD 40int N, g[MAXD][MAXD], vis[MAXD][MAXD];char b[MAXD];int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};void init(){ int i, j, k; memset(g, 0, sizeof(g)); for(i = 1; i <= N; i ++) { scanf("%s 阅读全文
posted @ 2012-05-03 14:21 Staginner 阅读(185) 评论(0) 推荐(0)
摘要: URAL_1032 这个题目不像网上有些人说的“需要选连续的数,是因为翻译的问题”,因为可以证明这个题目一定有解,而且可以证明一定存在一个选择连续的数的解。 不妨设a[i]为第i个数,A[i]=(a[1]+a[2]+…+a[i])%N,这样首先如果A[i]=0那么选择前i个数就可以了,如果不存在A[i]=0,那么A[i]的取值范围就缩小到了1~N-1,那么必然有两个不同的数x、y(x<y)使得A[x]=A[y],那么就有A[y]-A[x]=(a[x]+a[x+1]+…+a[y])%N=0,于是将第x个至第y个数选出来即可。 于是我们接下来要做的就是去找令A[x]=A[y]的x和y(可以补 阅读全文
posted @ 2012-05-03 13:54 Staginner 阅读(248) 评论(0) 推荐(0)
摘要: URAL_1031 dp的方程还是很好写的,但如果用裸的O(N^2)的dp的话应该会超时(不过后来翻解题报告的时候有人说O(N^2)也可以过),于是要优化dp的过程。 既然维数已经是一维了,不妨去着眼优化决策的过程,于是猜想到可能费用随着距离的增加是单调递增的(不过即便不是单调递增的,根据dp的方程我们也依然可以用单调队列进行优化),下面就来证明这一点。 设由x出发到y、z(x<y<z),花费分别为f[y]、f[z]。假设x->z的最优方案中在y的前面紧邻y的那一站是t(t等于y也可以),于是整体路程就变成了x->t->z,构造x->y的路线为x->t 阅读全文
posted @ 2012-05-03 10:48 Staginner 阅读(294) 评论(0) 推荐(0)