11 2013 档案

摘要:题意:一个工厂接到了N张订单。他们有M个车间,如果第i张单在第j个车间加工需要花费Zij的时间。现在给出这个Z的矩阵,问做完这N张单需要时间的平均值(总时间/N)包括等待时间。(比如说我在一个车间连续以1个时间单位接了3张单,那么总时间为1+2+3=6,平均值为6/3=2)(N,M 2 #include 3 #include 4 #include 5 #include 6 #define maxn 2600 7 #define maxm 1000000 8 #define INF 1 > q; 32 d[src] = 0; 33 q.pus... 阅读全文
posted @ 2013-11-20 21:56 浙西贫农 阅读(144) 评论(0) 推荐(0)
摘要:求补集。题意:给出一列长为n(n 2 int a[1000010],vis[1= 0;i--){11 if(vis[i]) continue;12 for(int j = 0;j < 22;j++){13 if(vis[i|(1<<j)]){14 vis[i] = vis[i|(1<<j)];15 break;16 }17 }18 }19 for(int i = 0;i < n;i++){20 if(v... 阅读全文
posted @ 2013-11-20 21:44 浙西贫农 阅读(243) 评论(0) 推荐(0)
摘要:题意:城市中有从左到右排列起来的高度为hi的n个塔。现在要求作出一些改变使得景观更美丽,也就是要从左到右排列起来的塔呈非递减序列。你可以用吊车吊起一座塔然后叠加到左右相邻的任意一座塔上,这样新塔的高度等于两座塔之和,每次做这样的操作,塔的总数都会减少1(废话)。问最少进行几次这样子的操作可以使得景观美丽。dp(i)表示使得前i个塔美丽的最小操作次数,sum(i)表示前i座塔的前缀和,last(i)表示使得前i个塔美丽操作次数最小的情况下,最右侧一座塔最小的塔高。那么就有状态转移方程:dp(i)=min{dp(j)+i-j+1},sum(i)-sum(j)>=last(j). 1 #inc 阅读全文
posted @ 2013-11-20 13:10 浙西贫农 阅读(265) 评论(0) 推荐(0)
摘要:题意:在一张地图上,有N(N 2 #include 3 #include 4 using namespace std; 5 typedef long long LL; 6 double dp[1010]; 7 struct Node{ 8 int x,y,t; 9 double p;10 }node[1010];11 12 int cmp(Node a,Node b){13 return a.t = 1;i--){32 dp[i] = 0;33 for(int j = i+1;j ans ? dp[i] : ans;39 }... 阅读全文
posted @ 2013-11-18 21:35 浙西贫农 阅读(336) 评论(0) 推荐(0)
摘要:1001 本题一般是新手的处女题。要熟悉ACM的输入输出规则。还是要注意一下题目里说的是Each line will contain two integersAandB. Process to end of file.也就是说有多组测试数据,要用循环去输入。cin是有返回值的,只要你不断的输入,循环就不会结束。还有,大家不用担心程序不会终止。其实你是可以手动终止程序的,当然,在OJ测试用的文件的末尾有一个EOF的标志,一旦读到了文件的末尾,程序就会终止。 1 #include 2 using namespace std; 3 4 int main(){ 5 int a,b; 6 ... 阅读全文
posted @ 2013-11-16 23:14 浙西贫农 阅读(271) 评论(0) 推荐(0)
摘要:题意:给出一张有向图,现在要你删去一些边构造一张新图,新图的要求有1.对于起点s,出度-入度=1.2.对于终点t,入度-出度=1.3.对于其余的点,入度=出度.另外,保留每条边需要花费ai,删掉每条边需要花费bi。现在求一个最小花费的方案使得能够构造出符合要求的图。看到这题首先想到以前做过的几个混合图欧拉回路的问题,因为本题跟混合图欧拉回路有一些类似的地方,比如说,我无法去控制每个点具体的出度入度到底是多少,但是可以知道它们之间的关系。并且对于每条边,我都不知道到底该不该留,所以可能会考虑先假定它到底是留下还是不留,然后利用每个点度数的关系跟源汇相连,用网络流去求解一个方案。所以本题就应该是一 阅读全文
posted @ 2013-11-15 20:36 浙西贫农 阅读(162) 评论(0) 推荐(0)
摘要:题意:Little Tom要“环”游一些城市,每个城市只能游玩一次。现在给出一张有向图和每条边的费用。求最小费用。要走环,很容易想到二分图匹配。这里还是一样的,拆点。把每个点拆开,变成i,i',分别和源点S汇点T相连,费用是0,容量是1。然后对原图中的每条边(u,v),对应边(u,v',1,cost),跑费用流,如果最大流=城市数,说明存在一个方案,答案就是最小费用流算出来的费用。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 210 6 #define maxm 100000 7 #define INF 阅读全文
posted @ 2013-11-14 10:33 浙西贫农 阅读(141) 评论(0) 推荐(0)
摘要:题意:不想描述了。。直接从这个博客抄了:http://www.cnblogs.com/rainydays/archive/2011/07/01/2095634.html有一些机器用来组装电脑,每台机器对输入机器的电脑有要求,符合要求的电脑被送入机器后会输出一台规定配件情况的电脑。而且分别告知每台机器在单位时间内处理电脑的台数。将这些机器连成生产线,问单位时间内出产的具有所有配件的电脑最多有多少台。其实就是个拆点的最大流,然后要求输出所有边的流量有变化的正向边。当然也可以不拆点做。WA了一次,题目有个小坑,就是如果所有输入都是2,那么它还是可以跟源点相连的。 1 #include 2 #i... 阅读全文
posted @ 2013-11-13 23:10 浙西贫农 阅读(166) 评论(0) 推荐(0)
摘要:题意:有4种硬币,面值分别为c1,c2,c3,c4,然后给出Q组查询。每组查询给出5个数d1,d2,d3,d4,v,分别表示面值为ci的硬币共有di个,然后要求将其凑成总值为v的方案数。数据范围大致是c 2 typedef long long LL; 3 LL dp[100010]; 4 5 int main(){ 6 int c[4],d[4],v,Q,kase; 7 scanf("%d",&kase); 8 while(kase--){ 9 dp[0] = 1;10 for(int i = 1;i = 0) ans += fl... 阅读全文
posted @ 2013-11-12 22:56 浙西贫农 阅读(494) 评论(0) 推荐(0)
摘要:题意:火星人要攻打地球,火星人将派来一些伞兵来破坏军事设施。已知他们将降落在一个矩阵行的地区,而且知道这些人会降落在哪一行那一列。现在地球人可以造一些大炮来攻击他们,一门大炮可以攻击一行或者一列,一个伞兵只要被他所在的行或列的大炮打中他就会挂,而在每一行、每一列造大炮的价格是不同的,建造大炮总价格等于你选择在某行或某列造大炮价格的乘积。现在要求把所有的伞兵都搞挂了并且让这个价格尽可能的小。看到乘积尽量小,想到了取对数。那么剩下的问题就是二分图点权覆盖的问题了。最后求完最大流之后,再还原这个费用就可以了。 1 #include 2 #include 3 #include 4 #includ... 阅读全文
posted @ 2013-11-12 19:13 浙西贫农 阅读(133) 评论(0) 推荐(0)
摘要:题意:给出一个流网络,问有仅将一条边的容量增大可以使得最大流增大的边有多少条。首先,肯定将是满流的边的容量增大才可能使得最大流增大。但是这些满流的边不一定能是最小割,即使它出现在最小割中,把它的容量增大也不一定能使最大流增大。那么考虑一下求完最大流后不能增广的原因,或者说,怎么样才能在残量网络中增广呢?从S出发,dfs出所有满流的正向边,给dfs经过的点标上f1。再从T出发,逆向dfs出所有满流的边,给dfs经过的点标上f2。那么如果有一条边是这样的:满流且有f1标记和f2标记,那么增加它的容量,残量网络就又可以增广了,最大流会增加,因此这样的边就是我们需要寻找的边。 1 #include . 阅读全文
posted @ 2013-11-10 22:18 浙西贫农 阅读(213) 评论(0) 推荐(0)
摘要:题意:有m个房间,你需要保护第n个房间使得其不被攻入。房间与房间之间会有门,门上有机关,因此当门关上时,只能从一边进入另外一边而不能从相反方向进入。现在告诉你这n个房间以及门的分布情况,以及开始的时候哪些房间里有贼,问至少关掉几个门使得房间n不被攻入。感觉这个题目蛮有意思的。比较容易想到最小割。如果从房间a到房间b有一个门,如果这个门关上了,且门上的机关使得贼只能从a进入b而不能让其从b进入a,那么这里对应两条边(a,b,inf),(b,a,1),如果房间i里面有贼,对应边(S,i,inf),而需要保护的那个房间n就会汇点T。然后求一遍最大流。如果maxflow>=inf就说明不存在合法 阅读全文
posted @ 2013-11-10 17:35 浙西贫农 阅读(208) 评论(0) 推荐(0)
摘要:好题。搜的题解敲的,没什么好多说的。但是还是想说两点:1.本来一直不理解为什么这种博弈的问题可以用DP去做,因为双方都采用最优策略的情况下,不知道他会如何选择,但是今天明白了,这种博弈问题,对于给定的一个状态,其结果就已经是确定了的。因此可以由一个最初的确定的状态搜出所有的其他状态。另外,这里的dp数组只要赋值一次就可以了,因为不管输入的数据怎么变,给定的状态的结果是不会变的。2.能在现场赛中做出这种难度的DP,是我的目标,当然,这还需要很多的努力和练习。毕竟就算这道题告诉我是DP了,我也不知道怎么设计状态。还有好几个容易出问题的小细节我都出问题了。差距还是很大的。 1 #include 2. 阅读全文
posted @ 2013-11-08 22:50 浙西贫农 阅读(236) 评论(0) 推荐(0)
摘要:题意:给出一张有可能自环、重边的有向图。每个节点i上都有两个值Wi+,Wi-,分别表示删掉所有i点的入边需要的代价和删掉所有i点的出边需要的代价。现在要求把所有的边全部删掉,求最小代价。显然一条边只和个点有关,要删掉一条边(i,j),要么付出Wi-,要么付出Wi+,很容易让人想到二分图。其实这就是一个二分图点权覆盖的问题。把每个点i拆为i,i'。对所有的Wi+,对应边(i',T,Wi+),对所有的Wi-.对应边(S,i,Wi-),对于图中所有的边(u,v),对应边(u,v',inf)。然后求最小割就是答案。 1 #include 2 #include 3 #includ 阅读全文
posted @ 2013-11-08 17:02 浙西贫农 阅读(251) 评论(0) 推荐(0)
摘要:题意:开始的时候p=1,2个人轮流对p进行操作,每次操作中,他们可以选择把p乘上一个数,这个数的范围是2-9。现在的问题是,给你一个n,两人轮流操作,谁先把p操作到p>=n谁就获胜,两人都采用最优策略,问谁获胜。根据给定的n,可以找出一些必胜、必败的区间。不如说给出的n是162,那么必败的区间是[18,161],必胜的区间是[9,17]。显然先手一次就可以把p的值直接变成9,所以先手可以获胜。然后去递推这些区间就行了,直到递推到区间左边的值为小于10的数。然后判断一下这个区间是必胜的还是必败的区间,被谁取到就可以了。 1 #include 2 using namespace std; 3 阅读全文
posted @ 2013-11-07 21:04 浙西贫农 阅读(193) 评论(0) 推荐(0)
摘要:题意:有7个人从m个数中任选一个不重复的,其中4和7是幸运数,一个人的幸运值等于他所选的数字中所有'4'的个数+'7'的个数。求一个人的幸运值比其他6人幸运值总和大的方案数。 1 #include 2 #define MOD 1000000007 3 using namespace std; 4 typedef long long LL; 5 LL dp[11][11]; 6 LL f[11],ans; 7 int bit[11],len; 8 void init(){ 9 dp[1][0] = 8;dp[1][1] = 2;10 for(int i = 2;i 阅读全文
posted @ 2013-11-06 18:37 浙西贫农 阅读(366) 评论(0) 推荐(0)
摘要:题意:有N艘船和N个港口,M个station。现在N艘船分别处在一些station上。有K条边连接站,有P条边连接港口和站。现在这N艘船都要回到港口,且每个港口只能容纳一艘船。问使这N艘船回到港口行程之和的最小值是多少。比较明显的求最小权匹配,用KM。做最短路的时候要注意如果船已经回到港口了,就不能再跑出去了,所以做floyd闭包或其他最短路的时候,松弛的时候不能用港口去松弛一个点对。然后得到各个船所在位置到各个港口的最短路后,把边权赋成负的船到港口的最短路值,然后跑KM就可以了。 1 #include 2 #include 3 #include 4 #include 5 #... 阅读全文
posted @ 2013-11-05 19:40 浙西贫农 阅读(154) 评论(0) 推荐(0)
摘要:裸的KM吧。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 105 6 #define INF 1 G[maxn]; 11 int W[maxn][maxn],n; 12 int Lx[maxn],Ly[maxn]; 13 int left[maxn]; 14 bool S[maxn],T[maxn]; 15 16 void init(int n) 17 { 18 this->n = n; 19 for(int i = 0... 阅读全文
posted @ 2013-11-05 14:49 浙西贫农 阅读(216) 评论(0) 推荐(0)
摘要:敲完此题我在想,或许我的智商不适合再搞下去了。。题意:有一组OX序列(长度 2 #include 3 using namespace std; 4 5 int main() 6 { 7 double ans = 0.0,pre = 0.0,now; 8 int n; 9 cin>>n;10 while(n--){11 cin>>now;12 pre *= now;13 ans += 2*pre+now;14 pre += now;15 }16 cout<<fixed<<setpr... 阅读全文
posted @ 2013-11-05 10:52 浙西贫农 阅读(434) 评论(1) 推荐(0)
摘要:题意:给出一张有n个点m条边带权的无向图,要你找出若干个回路并且使得所有的点都在某个哈密顿回路上,且所有的点只能出现在一个哈密顿回路中,求由n条边组成的若干回路的最小权值。跟HDU 3488基本一样,只不过把有向图改成了无向图。#include #include #include #include #define maxn 2010#define maxm 410000#define INF 1 Q; for(int i = 0;i 0 && d[u] + cost[i] < d[v[i]]){ d[v[i]] = d[u] + cost[... 阅读全文
posted @ 2013-11-04 19:52 浙西贫农 阅读(192) 评论(0) 推荐(0)
摘要:题意:给出一张有n个点m条边带权的有向图,要你找出若干个回路并且使得所有的点都在某个回路上,且所有的点只能出现在一个回路中,求由n条边组成的若干回路的最小权值。所有点只能出现在一个回路中,因此,所有的点都对应唯一的前驱或后继,因此这就是一个匹配问题。如果有边(u->v),边权为w,那它就对应二分图中的一条边(u,v',w),直接这样建图跑KM就可以了。当然,用这种写法的费用流会比较慢。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 410 6 #define maxm 70000 7 #define INF 阅读全文
posted @ 2013-11-04 19:19 浙西贫农 阅读(151) 评论(0) 推荐(0)
摘要:题意:挖金矿。一个矿有n层,每层有m块金子。要挖每块金子都有一个代价cost,每块金子都有一个价值cost,另外每块金子还有w个关系,表示如果要挖它,必须先挖掉第i层的第j块金子,求最大获利。最大闭合子图。 1 #include 2 #include 3 #include 4 #define maxn 3010 5 #define maxm 400000 6 using namespace std; 7 typedef long long LL; 8 const LL INF = 1LL 0) add_edge(S,pos,value),sum += value;78 ... 阅读全文
posted @ 2013-11-03 21:58 浙西贫农 阅读(200) 评论(0) 推荐(0)
摘要:题意:有n个城市。现在需要在这些城市上修一些通信的基站,在每个城市上修一个基站都需要花费一定的费用。另外给出m个组合(a,b,c),表示如果第a个城市和第b个城市都修起了基站,那么公司可以获利c。但公司并不需要在每个城市都修基站,他们只希望自己能够获得最大的利益。问最大利益。裸的最大闭合子图吧。只要知道这个模型就是水题。 1 #include 2 #include 3 #include 4 #include 5 #define INF 1<<30 6 #define maxn 55010 7 #define maxm 400000 8 using namespace std; 9 阅读全文
posted @ 2013-11-01 22:07 浙西贫农 阅读(285) 评论(0) 推荐(0)
摘要:题意:给出两个数n,m,求n到m之间所有数字的所有数位上的数的和。好久不做这类题思路总是很凌乱。具体看代码吧。 1 #include 2 typedef long long LL; 3 LL dp(LL x){ 4 LL ret = 0; 5 LL p[11]; 6 p[0] = 1; 7 for(int i = 1;i = 0;pos--){16 for(int j = 0;j < idx[pos];j++){17 ret += (sum+j) * p[pos];18 if(pos) ret +... 阅读全文
posted @ 2013-11-01 22:03 浙西贫农 阅读(218) 评论(0) 推荐(0)
摘要:题意:给出一张n个点m条边的有向图。现在编号为1的城市想进攻编号为n的城市。n为了防御1的进攻,需要破坏一些道路使得1到n不连通,而破坏每条路都有一个代价,题目会告诉你。现在编号为1的城市想要让编号为n的城市花费尽量多的代价来破坏道路使得1到n不连通,因此他们可以在2-n中的任意城市间修一条无坚不摧的桥(这条桥既可以是原来存在的也可以是原来不存在的),问n花费的最大代价。本来想先求一遍最小割,然后还原网络,把所有的割边的容量设为inf,求一遍最大流这样得到结果的。但是存在1到n不连通的情况,因此就不能求出最小割了。所以用到了一个更加暴力的方法。先求一遍最大流,得到maxflow,这是如果没有修 阅读全文
posted @ 2013-11-01 18:38 浙西贫农 阅读(301) 评论(0) 推荐(0)