06 2013 档案
摘要:题意:给定一个N*N个网格(每条边上共有N+1个点),从这个网格中取出三个点构成三角形,问一共可以构成多少种三角形。解法:首先令N' = N+1,那么不考虑直线相交的情况下从N'*N'个点中选出三个点的方案数为C(3, N'*N');然后考虑到每条平行于水平和垂直线的线段上共有2*N'*C(3, N')种情况需要减去,最后还要减去斜线直线上的情况。斜线上则只考虑从左上到右下的情况,乘以2表示从右到左是对称的。对于每一种斜线的情况都可以将左上端点和右下端点固定,然后就可以看作是一个矩形对角线上除去两个端点外,中间还有多少个点的问题了,对于这
阅读全文
摘要:题意:给定一个图,求从1到N的递增边权的最短路。解法:类似于bellman-ford思想,将所有的边先按照权值排一个序,然后依次将边加入进去更新,每条边只更新一次,为了保证得到的路径是边权递增的,每次将相同权值的边全部取出来一同更新,每条边能够更新的前提是某一个端点在之前被更小的边权更新过。另外一个要注意的地方就是一次相同边的更新中,要把所有的更新暂存起来最后一起去更新,这样是为了防止同一权值的边被多次加入到路径中去。代码如下:#include <cstdlib>#include <cstdio>#include <algorithm>#include &l
阅读全文
摘要:题意:给定N*N的网格,从某一点出发,问经过T时间后能够出现的位置有多少个?解法:由于从一个点出去后可以原路返回,所以我们只需要记录某个点在T时刻内能否在奇时刻或是偶时刻到达。最后统计一下奇数和偶数时刻到达各点的情况。注意如果8个方向都没方法行走,那么就呆在原地。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#include <queue>using namespace std
阅读全文
摘要:题意:给定一个两个数M,N,表示有N个1,N个2,一直到N个M,现在要求将这些数排列成一个M*N的矩阵,使得任意一行的两个相邻值差值不大于1,每一列没有两个相同的数。解法:直接输出M,M,M-1,M-1...这样的一个序列之和即可。代码如下:#include <cstdlib>#include <cstdio>#include <algorithm>#include <iostream>using namespace std;int M, N;int main() { while (scanf("%d %d", &M,
阅读全文
摘要:题意:给定N个点,每个点有一个停留所需的时间,和停留能够获得的满意度,有M条边,每条边代表着两个点走动所需的时间,现在问在规定的T时间内从指定的一点S到E能够获得的最大的满意度是多少?要求停留的点的满意度要依次上升。解法:这次虽然一看就是个DP,但是两个端点的处理要格外的注意,因为两个端点均可以选择路过的方式,而不是停留,因此需要虚拟出两个端点,两个端点分别表示路过起点和终点,虚拟端点与其他节点的距离也因注意连单向边,双向边就超时了。刚开始的时候打算终点不进行处理,而只是在搜索到这某个节点的时候特判一下是否为终点,对终点进行两种更新,一种是访问一种是路过,事后证明是不行的,因此路过的更新如果入
阅读全文
摘要:题意:给定一个网格图,图中有一些点要求全部走到,问最少的花费是多少,从任意边界进入,任意边界出去,如果不能够全部走到,输出0。解法:一次spfa从边界上的所有点出发,计算到K个宝藏的最短路,然后计算出任意两个宝藏之间的最短路,最后状态压缩枚举即可。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;// 记得要带走全部的物品 const int INF =
阅读全文
摘要:题意:非常简单,就是求一个表达式的最后结果。解法:http://blog.csdn.net/magic____/article/details/9021169代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;LL a, b, n, m;struct Matrix { int r, c; int a[2][2];
阅读全文
摘要:题意:给定一个N*N的网格,现在M组操作,一种操作时改变网格上的某个单点的权值,另外一种操作是求到一点曼哈顿距离为小于等于k的所有的权值和,初始化网格所有点的权值为0。解法:这题如果没有那些特定的条件,那么就是一个纯净的二维树状数组。对于题目中的要求需要解决的两个问题是:如何将题目中的曼哈顿距离转化为规则的矩形,以及如何避免开辟一个巨大的数组。1.如何转化为矩形问题,这里处理的方法就是把所有的点都旋转45度,需要一个2N*2N的数组数组才能容下坐标转换之后的图,坐标的转化方式为nx = x - y + N, ny = x + y - 1。可以这样看,转化之后的同行相邻两列的坐标差为(-1, 1
阅读全文