上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 66 下一页
摘要: 题意:有C头奶牛,K个挤奶站,每个挤奶器最多服务M头奶牛,奶牛和奶牛、奶牛和挤奶站、挤奶站和挤奶站之间都存在一定的距离。现在问满足所有的奶牛都能够被挤奶器服务到的情况下,行走距离的最远的奶牛的至少要走多远。解法:又是一个求最大中的最小问题,很容易想到用二分枚举来得出正确的答案。首先对整个图做一个floyd,求出两两之间的最短路,然后再枚举一个最大距离值进行构边,每次询问是否能够全部奶牛都能够被匹配到。注意:距离为0是当作INF处理,否则在floyd取min的时候要特判。代码如下:#include <cstdlib>#include <cstdio>#include &l 阅读全文
posted @ 2013-04-30 17:05 沐阳 阅读(870) 评论(0) 推荐(0) 编辑
摘要: 题意:很裸,M和N的顺序别搞错了。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int N, M;const int INF = 0x3f3f3f3f;struct Edge { int v, c, next; }e[500];int idx, head[205];int level[205];int front, tail, que[205];vo 阅读全文
posted @ 2013-04-30 14:56 沐阳 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 题意:一个农夫要把养殖的猪卖出去,现有M个猪圈,农夫自己没有猪圈的钥匙。现有N个客户要来买猪,每个客户手中有Ai把钥匙,分别表示成猪圈的编号,并且每个客户需要买一定的猪。这些客户依次过来(编号从小到大),现在农夫可以选择如何将这些猪卖给每一个客户,只要头数不超过需求即可。农夫在处理好每一笔交易后能够将打开的猪圈门之内的猪任意分配。现在问农夫能够卖出最多的猪的数量。解法:通过这一题,发现构边的时候其实是有很多技巧的,这题如果把猪圈放到图中的话那么将成为一道不可做题。原因是时间复杂度和空间复杂度太高了。其实可以画出一个简图,然后再通过合并边和合并点来简化构图。由于农夫能够在打开猪圈后任意分配猪。因 阅读全文
posted @ 2013-04-30 14:40 沐阳 阅读(326) 评论(0) 推荐(0) 编辑
摘要: A:ZZ买衣服简单的字符串处理问题,需要注意的是某一天买了之后接下来的天数中不能够再次购买。代码如下:Problem A_set#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <map>#include <algorithm>#include <set>using namespace std;int N, M;set<string>st;int main() { char str[100 阅读全文
posted @ 2013-04-29 19:16 沐阳 阅读(771) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个函数定义如下:对于q个点满足:给定f[1]-f[n]的数值,然后存在q个特殊的点,其于前面的关联的项数特殊,系数特殊,当然位置也特殊。现在要求f[n]的值。解法:如果题目中没有强调q个特殊点的话,那么可以使用矩阵快速幂搞出来。鉴于只有最多100个特殊点,我们可以选择分段进行处理,对每一个空隙进行一次矩阵快速运算,然后对于特殊点单独做一次。这里又有一个地方要特别注意:那就是q个点中有位置大于n的点。当然仅仅是一般的矩阵快速幂这题的复杂度将达到O(q*log(n)*L^3),结合多组数据这样会超时,一个优化就是使用一个列向量去依次乘以若干个矩阵,那么每一次相乘的复杂度就变成了L^2, 阅读全文
posted @ 2013-04-28 19:53 沐阳 阅读(464) 评论(0) 推荐(0) 编辑
摘要: 题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向。并且当相邻两个蚂蚁相撞时转向。现在问t时间后各个蚂蚁的位置。解法:这题的一个致命技巧就是把两只蚂蚁的相撞看作是两只蚂蚁交换穿过对方并且交换蚂蚁的编号。这个是很好理解的,类似于物理的完全弹性碰撞。又由于任何两只蚂蚁的相对位置在这种转弯的情况下不会改变相对位置,因此我们只要视作所有蚂蚁没有蚂蚁的行动。最后根据位置关系对应到原始的位置关系。最后再做位置判断的时候查看是否超出坐标之外即可。代码如下:#include <cstdlib>#include <cstring>#include <cstd 阅读全文
posted @ 2013-04-26 22:16 沐阳 阅读(692) 评论(0) 推荐(0) 编辑
摘要: 题意:有N个节点的图,现在要求构成一棵树(不存在环),且只能够有一个跟节点,每一层的节点数还必须相同。问有多少种不同的方式。解法:对于N个节点而言,如果第N个节点是N-1个节点任意一种组合情况下的boss的boss,这种事满足情况的,用f[N]表示方案数的话,那么这部分的值就是f[N-1];如果N不属于上面的情况,那么可以认为N个节点的组合下,boss下面就直接分成了一个个支,由于各层节点数要相等,因此每个分支的情况都要一样,所以N-1有多少个大于2的因子就有多少种情况了。综上:如果把f[x-1]看作一个分支的话,有:代码如下:#include <cstdlib>#include 阅读全文
posted @ 2013-04-25 13:52 沐阳 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个数N(1<=N<=10000),求N的一个最小的倍数能够被N整除。解法:粗看起来题意简单,但是确无从下手,其实正确的解法就是通过搜索来搞定,由于N不太,因此N的余数类也不会很大,采用从小到大的枚举策略能够使得后面达到的同余类状态不及前面的优秀,这样就能够在非常短的时间内找到答案。bfs过程中对于在状态与状态之间建立前驱指针,这样就能够输出最后的结果。一个状态需要记录以下值:1.当前状态对N的余数;2.当前放置的数字;3.前驱指针。状态之间的转移:mod' = (mod*10 + digit) % N从1位开始依次枚举,然后扩大到2位,3位.....代码如下:# 阅读全文
posted @ 2013-04-25 13:33 沐阳 阅读(810) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个数x,现在定义f(x)是a*b|x的情况下,a,b的组合情况有多少种。现在给定一个数N求f(1)+f(2)+...+f(N)。解法:一开始想到了a*b是x的约数,因此推出了f(x)的公式,也就是这个公式,使得我们在求前缀和的道路上寸步难行......正确的解法是对于任意一个a*b|c可以视为a*b*c = x,那么就把前缀和问题转化为a*b*c <= x的解的组合个数问题了。三个数a,b,c先暂时不考虑其位置关系带来的不同,规定a<=b<=c,那么分情况讨论:1.当a=b=c时有一种排列情况2.当a=b<c时有三种排列情况3.当a<b=c时有三种排列 阅读全文
posted @ 2013-04-24 23:01 沐阳 阅读(531) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一系列的单词要求按照字典序把他们全部输出来。解法:首先判定能不能构成欧拉回路,然后就是O(E)的dfs计算出来。这题使用Fleury模板没搞出来,原因这里要根据单词来走边,而该算法得到的是节点访问序列。后面看到一种dfs,既能够保留边又能够保留点又简单多了,以后果断专注这种写法。代码如下:#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <string>#include <vector>#incl 阅读全文
posted @ 2013-04-24 15:00 沐阳 阅读(412) 评论(0) 推荐(0) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 66 下一页