摘要:
题意:给定一个两个数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 阅读全文
摘要:
题意:转化后为给定一个数L,问L拆成N个不同的数相加的方案数,其中N>=2。解法:其实和上次做的分解的2的幂的数量相同,由于要求每个数都不相同,这里有一个非常好的观察角度,那就是观察一个数的分解中是否存在1,再加上考虑其能够被分解的数的个数即可建立递推关系。设f[i][j]表示数 i 被分成 j 个不同的数相加的方案数,那么考虑最后分解中不含有1,那么这部分由f[i-j][j]得到,因为后者的每一个分解出来的数都加上1就行了;接着考虑分解中含有1,那么可以假定这个1就是最后分出来的,因为分解的顺序并不影响最后的结果,由于分解中数均不相同,扣除1后,就变成了f[i-1][j-1]中不含有1 阅读全文
摘要:
题意:给定若干根长度为Li的绳子,现在每条绳子只能够切成两份或者不切,问最后最多产生多少根长度相等的绳子?解法:首先明确一定就是每条绳子最多对结果贡献2,因为一条绳子最多切成两份,且当最后结果为其长度的一半时才成立,其余绳子要么贡献为0(长度小于枚举长度),要么贡献为1(长度大于枚举长度不等于2倍的枚举长度)。因此可以枚举这个所切的长度,很容易推出这个长度一定会是某个绳长的一半,由于绳子的长度可能会出现奇数,因此给所有的长度乘以2之后再枚举每条绳子的一半就可以了,使用树状数组初始化前缀和,如果枚举的长度为Lx最后的结果为长度为Lx到MaxL的数量加上长度为2*Lx的绳子数。代码如下:#incl 阅读全文
摘要:
题意:给定一个很优美的三角形,问从第1层走到第N层的走法有多少种?解法:由于每一层能够向左右行走到任意位置再向下走,所以设f[i]为从第一层到第 i 层的方案数,则有递推关系f[i] = f[i-1] * 2 * i。由于最后的结果是对1000003取余,所以1000003之后的结果一定都为零。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>#include <set>using 阅读全文
摘要:
题意:三维子矩阵最大和。解法:枚举三维的平面两维,然后将第三维转化为线性求解,时间复杂度O(n^5),这题被读入数据方位坑了,绝对值不超过2^31,负数没有问题,int形最大正整数是2^31-1...... 导致一直WA,欲哭无泪。代码如下:#include <cstdlib>#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;typedef long long LL;const LL INF = 1 阅读全文
摘要:
题意:给定N个三维平面点,每个点都有一个高度,每两个点之间的需要构边,边的距离由x,y坐标的欧几里得距离确定,边的花费有点的高度差即z值确定,现在问一个合理的生成树中,花费比上距离的最小值为多少?解法:每一条边对应于一个高度差,设每条边的高度差为Hi,距离为Li,则要求找到一组边集满足,一如既往的,我们假设一个比例R使得有成立,那么对式子变形后有,得到这个式子后,我们就能够将边权进行修改,求一个最小生成树来判定是否满足<=0的要求。由于图是一个稠密图,所以kruskal算法超时了,改成prim后,priority_queue照样超时,最后改成最普通版的才Ac掉。代码如下:#include 阅读全文