摘要:
题意:给定一个数N,表示有N个位置,要么放置0,要么放置1,问至少存在一个连续的M个1的放置方式有多少?分析:正面求解可能还要考虑到重复计算带来的影响,该题适应反面求解。设dp[i][j]表示到前 i 为后导 1 个数为 j 的方案数,于是有动态规划方程:dp[i][0] = sum{ dp[i-1][0... min(i-1, M) ] };dp[i][j] = dp[i-1][j-1] 其中 j != 1单单根据这个方程时间度为O(N*M),还是不足以在有限的时间内解出该问题。通过观察我们发现方程可以简化,即后一层的和值是上一层和值的两倍减去上层的最后一个值。于是可以维护一个最后一个值得队 阅读全文
摘要:
CF328BSheldon and Ice Pieces题意:给定一个数字序列,问后面的数字元素能够组成最多的组数。分析:把2和5,6和9看作是一个元素,然后求出一个最小的组数就可以了。#include #include #include #include #include #include using namespace std;char obj[10000];char str[10000];int digit[15], rec[15];inline int get(char ch) { if (ch == '5') return 2; else if (ch == ' 阅读全文
摘要:
sgu542Gena vs Petyasgu543Cafe题意:有N组人需要被分配到某些固定了人数的桌子上,其中ai表示第i组有多少个人,安排作为需要符合如下安排:某一组的人员不能够单独在一张桌子,每张桌子坐的人数不能够超过其限制,问至少要安排多少张给定了人数限制的桌子。分析:此题是一个贪心题,如果直接求解的话,由于桌子的数量是未知的,因此不太好分配,因此二分桌子的数量,在已知桌子的数量后运用贪心规则来求得最优解。但尽管在二分已知桌子的情况下还是不太好实现这个贪心规则。其思路是这样的:1.如果桌子的限制为奇数,那么想办法把这些的桌子用奇数人数的组分出1个3来填,使得其限制变成偶数,这样是为了更 阅读全文
摘要:
题意:有n个球,其中有0、1、2...n个黑球的概率是相等的,现在从中取出L个球,p个黑球q个白球。现在问猜一个黑球的区间,使得落在这个区间的概率大于给定的一个数值。详见代码:#include #include #include #include #include using namespace std;int n, p, q, pri;/* n个球,取出p+q个球,其中黑球p个,白球q个,要求的概率最低值为p 设n个球中有k个黑球的事件为Ak ,设取出p+q个球中有p个黑球为事件B题目所有概率为sum{p(Ak|B)}>=pri的k的取值区间 p(Ak|B)不好求解,通过贝叶斯公式p( 阅读全文
摘要:
508Black-White Balls221509Chameleons All Around44510Distinct Substrings149511Fermat's Last Theorem111512Friendly Points80513Maximal Clique56514Polygon88515Recover Path159516Schedule10sgu 508http://www.google.com.hk/search?newwindow=1&safe=strict&hl=zh-CN&biw=1366&bih=643&noj= 阅读全文
摘要:
题意:给定一个最小费用流的模型,根据给定的数据判定是否为最优解,如果不为最优解则给出一个比给定更优的解即可。不需要得出最优解。解法:由给定的数据能够得出一个残图,且这个图满足了最大流的性质,判定一个残图是否满足最小费用最大流的判定依据类比于最大流中的层次图的构建,此时只需要判定图中是否存在负环即可。在写的过程中由于图中的编号和抽象了之后的编号有一个变换关系,所以处理要小心,一开始直接写了个最小费用最大流,通过费用来判定是否为最优TLE。找负环的时候,该题宜从汇点开始遍历,因为源点发出的边肯定全部满流(由于要疏散所有的人),而市政大楼与避难所在内部又分别没有边相连,所以要形成回路就必定会经过汇点 阅读全文
摘要:
二维数组中的查找分析:既然已经给定了每一行从左至右递增,那么对于每一行直接二分查找即可,一开始还想着每一列同样查找一次,后来发现每一行查找一遍就能够遍历所有的元素了。#include #include #include #include #include #define MaxN 1000using namespace std;int N, M, x;int a[MaxN+5][MaxN+5]; bool bisearch(int *base, int delta, int l, int r, int val) { int mid, t; while (l > 1; ... 阅读全文
摘要:
题意:给定一个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 阅读全文