05 2013 档案

摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2236思路:引:为了保证每行每列只取一个元素,我们可以从二分图最大匹配的思想入手,把行和列分别看做二分图左右两部分,i-j的边权就是第i行第j列的元素的值。这样构图之后,求得的二分图最大匹配的4条边就是不在同行或同列的4个元素。有了这个思想时候,我们只需要再保证4个元素中最大值与最小值之差尽量小就可以了,于是我们可以二分枚举最大值与最小值之差,并枚举边权值的下界,如果枚举到某个边权值的下界时该图存在最大匹配,那么就更新max,否则就更新min。 1 #include<iostream> 阅读全文
posted @ 2013-05-31 21:55 ihge2k 阅读(537) 评论(0) 推荐(0)
摘要:题目链接:http://gnu.bnu.edu.cn/contest/problem_show.php?pid=4359思路:直接递推就可以了,dp[i][0]表示前i位不含4或者13,且最后一位不为1的个数,dp[i][1]表示前i位不含4或者13,最后一位为1的个数;于是有dp[i][0]=8*dp[i-1][0]+7*dp[i-1][1],dp[i][1]=dp[i-1][0]+dp[i-1][1]; 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cm 阅读全文
posted @ 2013-05-31 15:21 ihge2k 阅读(174) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2988思路:水题,kruskal求最小生成树之后,直接用总权值减去即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 222222 7 typedef long long LL; 8 struct Edge{ 9 int u,v,w;10 }edge[MAXN 阅读全文
posted @ 2013-05-31 11:46 ihge2k 阅读(301) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3501思路:首先用一下欧拉函数Eluar(n)求一下1-n中与n互质的质因子的个数,然后就要用到下面简单的定理了:如果gcd(n,i)==1,那么就有gcd(n,n-i)==1;于是题目的要求是要求小于n并且与n不互质的所有数的和,这里我们可以先求与n互质的所有数的和为sum=n*(Eular(n)/2)(这里用到了上面的定理。最后所有数的和减去sum即可。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstri 阅读全文
posted @ 2013-05-31 11:04 ihge2k 阅读(402) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4360思路:首先就是要寻找最短路了,然后就是要着“LOVE”连着最多的最短路了,这里我们可以用一个二维数组来记录“LOVE”最多的最短路,然后每次spfa更新的时候维护一下就可以了(每当以‘E'结尾是就要num[i][j]++),最后的情况就是要考虑一下特判n==1是的情况了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 阅读全文
posted @ 2013-05-30 21:52 ihge2k 阅读(274) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4396思路:dist[i][j]表示到顶点i走了k条路所花费的最小时间,为了节省内存,当j>=k时,直接令j=k即可,然后就是二维spfa求最短路了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<vector> 7 using namespace 阅读全文
posted @ 2013-05-30 15:53 ihge2k 阅读(367) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2608思路:T[n]为1时当且仅当n为某数的平方或者是某数平方的2倍。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 typedef long long LL; 8 9 int main(){10 int _case,n,ans,k;11 scanf("%d",&_case);12 while(_case--){13 scanf("%d", 阅读全文
posted @ 2013-05-30 13:07 ihge2k 阅读(234) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4293思路:这题dp的状态比较难想,dp[i]表示前i个人最多有多少人说真话,而num[i][j]表示当前人的前面有i个人,后面有j个人的个数,于是有dp[i]=max(dp[i],dp[j]+num[j][n-i])(0<=j<i); 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 555 6 int n 阅读全文
posted @ 2013-05-29 22:31 ihge2k 阅读(200) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3560思路:dfs判环,这里成环的条件是环中的每个点的出度和入度都为1,因此dfs的时候只须判断的相连的每个点的size()==2即可。ps:为防暴栈手动开栈:#pragma comment(linker,"/STACk:10240000,10240000") 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #in 阅读全文
posted @ 2013-05-29 19:18 ihge2k 阅读(551) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4034思路:要对floyd有深刻的理解才能A这道题,边数最多的情况是每两点之间都有最短的直边相连,故最多为n*(n-1),在每两点都有最短直边相连情况下,我们可以一一删去多余的边,最后就是最终结果。即若dist[i][j]=dist[i][k]+dist[k][j],则i 与 j的这条边可以删去.若dist[i][j]>dist[i][k]+dist[k][j],则说明dist[i][j]并不是最短路,存在矛盾,此时则不存在这样的图,输出impossible。 1 #include 2 #in 阅读全文
posted @ 2013-05-29 18:23 ihge2k 阅读(288) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2648思路:map映射,记录一下memory的位置即可。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int Point[10010]; 9 10 int main() {11 int n,m,pos,price;12 while(~scanf("%d",&n)) {13 memset(Point,0,sizeof(Point));1. 阅读全文
posted @ 2013-05-28 22:13 ihge2k 阅读(452) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3873思路:题目意思很简单,就是说如果没有攻占保护x的城市,就不能攻占,我们可以用pro[x]记录保护x的所有城市被攻占的最早时间,那么能到x的最短时间为pro[x]和到达x的最短路中的较大者 .dij入队过程中只把In[x](没有被包含的城市)入队 对于出队的x,它的最短时间已经确定,表示已经被占领,它所保护的城市的保护度减1,一旦某个被保护的城市的保护度为零且已经到底(未占领,d[x]!=inf),就可以确定到达它的 最短时间(为max(pro[x],dist[x])),它也就到了入队的时机。 阅读全文
posted @ 2013-05-28 13:26 ihge2k 阅读(895) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3631思路:由于只能用标记的点去更新,并且又要求任意两点之间的最短距离,显然floyd是最合适的。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<vector> 7 using namespace std; 8 #define MAXN 333 9 #de 阅读全文
posted @ 2013-05-23 19:56 ihge2k 阅读(478) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3832思路:三次spfa求出1,2,3到各点的最短距离,然后枚举中间点到这三点的最短距离之和为ans,最后就是n-ans-1了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 #define MAXN 222 8 #define inf 1 阅读全文
posted @ 2013-05-23 17:46 ihge2k 阅读(258) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4528思路:结构体里面不仅要记录x,y,time,还要有2个bool型来记录是否看到二明和大明,因此,对于状态判重,开个4位数组mark[x][y][tag1][tag2],因为根据看到的人不同,我这个点(x,y)还是可以 重复走的,最后就是关于怎么来判断看到的人了,这儿我用了最暴力的方法,就是一开始的时候记录二明和大明所在的位置,然后将其改为'X',因为这两个位置小明是不能走的。然后就是如果横坐标相同,就y方向上看能否看到(同理)。如果对于当前节点p有p.tag1=p.tag2=t 阅读全文
posted @ 2013-05-22 23:28 ihge2k 阅读(246) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 222222 7 int level[MAXN]; 8 int dp[MAXN]; 9 int n,w,l;10 11 int main(){12 while(~scanf("%d",&a 阅读全文
posted @ 2013-05-22 21:50 ihge2k 阅读(216) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1300思路:直接写递推方程式:dp[i]=min{dp[j]+value}(0<=j<i,value为第j+1类珠宝到第i类全部以i类买入的价值; );然后我们可以用一个数组记录一下0-i的花费 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 1111 阅读全文
posted @ 2013-05-22 17:37 ihge2k 阅读(256) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503思路:如何求最长公共子序列就不说了,另外如果有str2[j]==str1[i],那就mark[i]=j,相当于一个标记。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 111 7 int dp[MAXN][MAXN]; 8 char str1[MAXN], 阅读全文
posted @ 2013-05-22 17:02 ihge2k 阅读(471) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3535一道需要深刻理解状态转移的背包题:dp[i][j],表示第i组,时间剩余为j时的快乐值。每得到一组工作就进行一次DP,所以dp[i]为第i组的结果。1、至少选一项,即必须要选,那么在开始时,对于这一组的dp的初值,应该全部赋为负无穷,这样才能保证不会出现都不选的情况。状态转移方程为dp[i][k]=max{ dp[i][k],dp[i-1][k-cost[j]]+val[j],dp[i][k-cost[j]]+val[j] }。dp[i][k]是不选择当前工作;dp[i-1][k-cost[j 阅读全文
posted @ 2013-05-21 22:52 ihge2k 阅读(199) 评论(0) 推荐(1)
摘要:题目链接:http://acm.cug.edu.cn/JudgeOnline/problem.php?id=1317思路:dp[i][j]表示以a[i]为结尾的串与以b[j]为结尾的串的最小编辑距离,则若a[i]==a[j],有dp[i][j]==dp[i-1][j-1];否则dp[i][j]=min{dp[i-1][j-1]+2,dp[i-1][j]+3,dp[i][j-1]+3} 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 # 阅读全文
posted @ 2013-05-21 22:36 ihge2k 阅读(207) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4526思路:dp[i][j]表示前i辆车送走j个acmer的最小花费,然后就有dp[i][j]=dp[i-1][j-k]+k*t+d;(t为车辆到达的时间,d为花费),值得注意的地方是dp[0][0]=0,而其余都应该初始化为inf. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 #define 阅读全文
posted @ 2013-05-21 17:20 ihge2k 阅读(203) 评论(0) 推荐(0)
摘要:题目链接:http://acdreamoj.sinaapp.com/problem.php?id=1083没什么好说的,具体看代码吧。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 int dp[11][4];//0没有3和8,1只有3,2只有8,3有3和8 7 int digit[11]; 8 9 int dfs(int pos,int have,int doing){10 if(pos 阅读全文
posted @ 2013-05-21 10:10 ihge2k 阅读(713) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1544思路:枚举中间点,分为奇数长度和偶数长度,然后向两边扩展就可以了,如果不相等,就直接跳出; 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 5005 6 char str[MAXN]; 7 8 int main(){ 9 while(~scanf("%s",&str)){10 int len=strlen(str),l,r;11 int ans=len;12 ... 阅读全文
posted @ 2013-05-20 23:54 ihge2k 阅读(1429) 评论(0) 推荐(1)
摘要:题目链接:http://acm.upc.edu.cn/problem.php?cid=1028&pid=3刚刚做的比赛的一道dp题,感觉不错,就拿出来分享一下:思路://dp[i][j][k]表示前i个字符算出的值是j并且最后一位为k(0/1)的数的个数//dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];//dp[i][j][1]=dp[i-1][j-1][1]+dp[i-1][j][0];下面的就简单了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring& 阅读全文
posted @ 2013-05-20 22:24 ihge2k 阅读(234) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3468大牛思路:用BFS找出每一个集合点到其它可达点的距离以及这个集合点到下一集合点的距离枚举是否能从一个集合点K经过一个宝物点X到达下一个集合点(K+1).如果能的话,则path[K][X]=true;如果发现有一个集合点不可达的话,则输出-1; 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 110 8 char map[MAXN][MAXN]... 阅读全文
posted @ 2013-05-20 19:01 ihge2k 阅读(237) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4549思路:大牛思路:简单推导下有, a, b, a^1*b^1, a^1*b^2 .... 可以知道a,b的幂满足Fib, 然后构造矩阵快速幂...就好了.还需要个性质: A^X = A^( X mod Eular(M) ) ( mod M ) .然后我就郁闷啦,自己的代码怎么都过不了,orz...一下是wa代码,哪个大神帮忙看看: 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MOD 10 阅读全文
posted @ 2013-05-20 11:02 ihge2k 阅读(655) 评论(1) 推荐(0)
摘要:最近重新学习了一下KMP算法,然后重新做了自己的模板。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 #define MAXN 10010 7 #define MAXM 1000010 8 char str1[MAXN]; 9 char str2[MAXM];10 int Next[MAXN];11 12 int len1,len2;13 14 void Get_Next(){15 int j=... 阅读全文
posted @ 2013-05-20 10:57 ihge2k 阅读(244) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4308思路:就是一般的广搜,然后要注意的地方就是位置P了,一次把所有的都入队列,然后标志置为true。别的的话就是随便搞搞就行了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define inf 1<<30 7 #define MAXN 5050 8 struct Node{ 阅读全文
posted @ 2013-05-19 19:50 ihge2k 阅读(230) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4548思路:打表什么的没有什么技巧性可言,最后二分的时候得小心返回位置!!! 1 #include 2 #include 3 #include 4 using namespace std; 5 bool mark[1000010]; 6 int num[1000010]; 7 int k; 8 9 int Judge(int n){10 int ans=0;11 while(n){12 ans+=n%10;13 n/=10;14 }15 ... 阅读全文
posted @ 2013-05-18 18:56 ihge2k 阅读(590) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2512思路:dp[i][j]表示第i张校园卡放到j本书中(保证每本书中必须至少有一张校园卡)的方案数,于是有dp[i][j]=j*dp[i-1][j]+dp[i-1][j-1](从i-1到i的状态可以在有j本书的情况下选择任意一本书放入校园卡,也可以放入放到新加进来的书中)这样的话最后只要FOR(i,1,n)sum+=dp[n][1]就可以啦(表示n张校园卡可以放入一本书或者2本书...或者n本书的情况总和)。 1 #include<iostream> 2 #include<cst 阅读全文
posted @ 2013-05-18 11:21 ihge2k 阅读(217) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1983思路:算得上是暴力解放了。。。orz...由于最多封锁4个区域,因此直接dfs枚举,bfs暴搜即可!!!跑了将近4000ms啊... 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define MAXN 10 7 struct Node{ 8 int x,y,time; 9 int ke 阅读全文
posted @ 2013-05-18 11:21 ihge2k 阅读(230) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1895思路:就是先两两合并,然后排序一下二分就可以了,最后要注意的地方就是二分找到解得时候,还要看一下相邻的数是否与解相等(因为可能有多个这样的数)Ps:郁闷死了,一开始用的是long long ,然后wa到死,结果改成int就过了,而且那个1000000007也没有用,orz... 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 333 8 int num[6] 阅读全文
posted @ 2013-05-18 10:01 ihge2k 阅读(210) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1044思路:看网上大牛们的做法都是bfs+dfs,弱菜表示不会啊,然后觉得bfs也应该不会超时吧,就搞了一把,orz...890ms险过。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define MAXN 52 7 struct Node{ 8 int x,y,time; 9 int va 阅读全文
posted @ 2013-05-17 16:09 ihge2k 阅读(339) 评论(1) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973思路:简单bfs,先打个素数表,然后就是广搜搞一下就ok了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<string> 7 using namespace std; 8 #define MAXN 10100 9 struct Node{10 string 阅读全文
posted @ 2013-05-16 17:14 ihge2k 阅读(427) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1885思路:对于钥匙,才4把,直接状态压缩搞一下就好了,然后就是开个三位数组标记状态了,跟普通bfs没什么区别。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 #define MAXN 110 8 struct Node{ 9 int x,y,st 阅读全文
posted @ 2013-05-15 22:35 ihge2k 阅读(576) 评论(0) 推荐(0)
摘要:贴几道bfs题。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2216思路:用一个四维的数组来保存状态,然后就是一般的bfs了,不过要注意的S,Z的初始位置要置为'.'(这个地方debug了好久,orz...).View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 # 阅读全文
posted @ 2013-05-14 23:51 ihge2k 阅读(263) 评论(0) 推荐(0)
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1538题意:最短路问题,但是要求出最短路的条数,同时要求出所有可能的最短路选择中javabean最多的情况。思路:求到终点的最短路径用Dijkstra,其路径更新条件(如果到某个点有多个路径长度一样的最短路径,则选择豆子总数最多的)就是直接加个else if条件就搞定了,最后就是dfs搜一下最短路的条数了,这个我就记忆化了一下。然后我一开始使用spfa写的,wa了好多次,orz...改成dijkstra就过了。 1 #include<iostream> 阅读全文
posted @ 2013-05-14 21:53 ihge2k 阅读(324) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1067思路:学会了手写Hash。。。orz....纪念一下。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 #define MAXN 1000007 8 typedef long long ll; 9 ll Hash[MAXN]; 10 11 st 阅读全文
posted @ 2013-05-14 16:44 ihge2k 阅读(717) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2438网上大牛思路:可以根据边界,汽车已经转弯,设水平方向为x轴,垂直方向为y轴。则汽车的内边界(靠近里面的边界)的直线方程式f(x)为:y=x*tan(a)+l*sin(a)+d/cos(a).其中a是汽车与x轴的夹角当y=X时,求解出的-x即为汽车的内边界到y轴的距离h,若h小于Y即可转弯,若大于Y就不能转弯。所以只需要利用方程式,求-x的最大值,即可判断能否通过。由于f(x)是凸函数(随着x的增大y先增大后减小),所以,需要借助三分求解。图示:第一道三分求极值题啊!!! 1 #include 阅读全文
posted @ 2013-05-14 12:30 ihge2k 阅读(1350) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160思路:就是排序后求最长递增子序列,只不过多了一个判断(s下降)以及最后输出下标,我们可以用一个pre[]数组来记录路径,最后递归输出就行了。 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define MAXN 1010 7 struct Mice{ 8 int w,s,id; 阅读全文
posted @ 2013-05-13 21:55 ihge2k 阅读(432) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1252题意都读了半天,orz...给出n个结点,每两个结点之间都有一个线路想通,不过有不同的颜色,然后给三个piece,分别在三个初始位置,piece移动的条件是通过的路径的颜色必须要与另外两个piece所在位置之间的路径颜色想同,求使三个点移动到同一个位置上所需要的最小步数……开个三位数组记录一下状态就好了,简单bfs.View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 阅读全文
posted @ 2013-05-12 23:25 ihge2k 阅读(320) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1307先说一下题意,就是给你n维起始点和终点的坐标,然后后面给出一系列的点,每一行表示这两个点之间有通路,最后让你判断一下能否从起点出发走到终点。由于最多不超过10维,那么我们把每个点的坐标转化为一个整数,然后建邻接表,这样dfs就可以了(值得注意的是我们用set来判重,当然你也可以用数组什么的)可以说是dfs+map+set的妙用了!View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath&g 阅读全文
posted @ 2013-05-12 22:12 ihge2k 阅读(388) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226思路:广搜,每一个状态用一个结构体来保存,记录数组的长度,然后根据长度来扩展就可以了,这里值得注意的地方余数判重以及求大数取模。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 using namespace std; 7 #define MAXN 555 8 #defi 阅读全文
posted @ 2013-05-12 19:59 ihge2k 阅读(300) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2610http://acm.hdu.edu.cn/showproblem.php?pid=2611、很好的两道搜索题,都用到了判重。。。orz....不怎么会,看了大牛的解题报告才理解。。。跪神牛大牛的hdu 2610思路:题意很简单就是在给定的序列中找到固定个数的递增的子序列,如果子序列的总个数少于要求的个数,那么就把所有的子序列输出即可,注意每组测试用例就为有一空行。技巧一:重判,这里有两个重判,第一个重判是判断如果搜索的是子序列的第一个元素,那么判断从原始序列开始到当前位置是否已经出现过该元素 阅读全文
posted @ 2013-05-12 17:44 ihge2k 阅读(865) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2897转引:巴什博弈的变形:假设先取者为A,后取者为B,初始状态下有石子n个,除最后一次外其他每次取得石子个数必须在[p,q]之间。若当前石子共有n=(p+q)*r个,则A必胜,必胜策略为:A第一次取q个,以后每次若B取K个,A取(p+q-k)个,如此下去最后必剩下p个给B,所以A必胜。若n=(p+q)*r+left个(1<left<=p)B必胜,必胜策略为:每次取石子活动中,若A取k个,则B去(p+q-k)个,那么最后剩下left个给A,此时left<=p,所以A只能一次去完,B 阅读全文
posted @ 2013-05-12 00:14 ihge2k 阅读(731) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1514思路:orz...大牛讲的太妙了:题意是给4堆(堆的高度小于等于40)有颜色(颜色的种类小于等于20)的物品,你有一个篮子最多能装5件物品,每次从这4堆物品里面任取一件物品放进篮子里,但是取每堆物品时,必须先取上面的物品,才能取下面的物品,如果发现篮子里的两种物品的颜色一样,那么把这两种物品拿出来,问最后最多能拿出多少对物品?;解题思路:记忆化搜索+dp+状态压缩;因为40×40×40×40不会太大,所以可以用dp[x[1]][x[2]][x[3]][x[4]]记 阅读全文
posted @ 2013-05-11 23:51 ihge2k 阅读(345) 评论(0) 推荐(0)
摘要:贴几道记忆化搜索题:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1208思路:记忆话搜索,不过有一个trick就是如果map[i][j]==0并且不是终点,就直接返回0了。如果map[i][j]表示跳几格 dp[i][j]表示有几种条法,其实就是一个子状态继承问题,如果map[i][j]为k,那么 dp [i+k][j]和dp[i][j+k]就可以增加 dp[i][j]种跳跃方法了。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstrin 阅读全文
posted @ 2013-05-11 21:35 ihge2k 阅读(265) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2677思路:一开始没思路,看大牛一博客也的。。。orz....为了方便处理给每一个装备一个标号,并记录价格和拥有数量,买不到的装备价格用一个特殊的数标记,然后对需要的装备进行递归处理,对于一件装备,如果已经拥有就直接用,如果没有就买,如果买不到就合成。数据保证需要的装备肯定能得到。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 阅读全文
posted @ 2013-05-11 21:18 ihge2k 阅读(231) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1625、思路:大牛说是floyd判环,一想确实如此,我还一直在想如果用记忆化的怎么处理环呢...orz....首先通过Floyd预处理,把所有的路径数求出来,即d[i][j]+= d[i][k] * d[k][j]。然后确定有无环,如果存在环的话,即d[k][k] != 0(存在环),那么所有的点i,j,只要经过了k(i->k->j),那么它的路径数是不能确定的,反之,确定。View Code 1 #include 2 #include 3 #include 4 using namesp 阅读全文
posted @ 2013-05-11 11:53 ihge2k 阅读(675) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3061思路:最小割的模型,具体的构图是:从源点连接正权的点,流量上限为该点的权值;从负权点连接汇点,流量上限为该点权值的绝对值;所有具有拓扑关系的点直接,从st连接end一条INF上限的边;求出最大流,最后用所有正权点的和减去最大流(最小割),便是答案。具体请参见07年的集训队论文《最小割模型在信息学竞赛中的应用》。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 usi 阅读全文
posted @ 2013-05-10 21:53 ihge2k 阅读(298) 评论(0) 推荐(0)
摘要:题目链接:网上一大牛说的好:结论:正的权值的和-建图后的最小割的容量选择了一条边就会选择两个点,边的花费为正,点的花费为负,把边看成点,这个点向两个端点连一条边,表示选择这条边就会选择这两个点然后题目就相当于最大权闭合图的模型了(最大权闭包模型中vs与正收益的点连边,负收益的点与vt连边,容量取绝对值,然后点与点之间连容量为inf的边)题意:有n个点,m个选择,建造n个点各自需要一定花费,每个选择有一定的获利,会选择两个点,当然也要花费。求最大的获利每个选择看成是获利点,每个点看成是花费点,新建源点向获利点建边,权值为获利的大小,花费点向汇点建边,权值为花费的大小每个选择向相应的两个点连一条容 阅读全文
posted @ 2013-05-10 21:21 ihge2k 阅读(491) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3917思路:就是一个最大权闭包的模型,解法为求最小割,构图方法以公司为点,如果公司之间有关系,则连一条容量为无穷的有向边,对每个公司,如果该公司收益为正,则从vs到该公司连一条容量为收益的有向边,如果为负,向vt连一条容量为该公司收益绝对值的边,为0时选和不选不影响结果,可以舍去。其消费为所有收益和-所选割中正收益-所有割中负收益(减去负的即为加上绝对值),然后求出最小割,最后相减即可。(胡伯涛的论文《最小割模型在信息学竞赛中的应用》里面有这个模型)View Code 1 #include<i 阅读全文
posted @ 2013-05-10 20:38 ihge2k 阅读(647) 评论(0) 推荐(0)
摘要:几道搜索水题,搜索要点就是不断剪枝,必要时还要不断恢复路径。慢慢体会递归的强大!!!题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1342View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 55 6 int num[MAXN]; 7 int path[MAXN]; 8 int k,len; 9 10 void dfs(int x,int cnt){1 阅读全文
posted @ 2013-05-10 17:01 ihge2k 阅读(542) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516思路:网上大牛说是著名的斐波那契博弈模型:首先 2个石头肯定是必败点,3个石头也是必败点,然后开始看后面,4个石头时,可以去一个使对手到必败点,而对手在这种情况下在必败点是不能赢得,所以4是必胜点。但是后面5个石头的情况就不同了,因为5个石头 你肯定不会sb的走到4这个必胜点让对手赢, 但是你发现走到3时,在3这个位置可以直接获胜。 所以5是必败点。View Code 1 #include<iostream> 2 #include<cstdio> 3 using nam 阅读全文
posted @ 2013-05-09 23:54 ihge2k 阅读(206) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847思路:首先我们知道3是必败点,然后类似于巴什博弈,直接对n%3考虑就行了。View Code 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 int main(){ 6 int n; 7 while(~scanf("%d",&n)){ 8 n%3==0?puts("Cici"):puts("Kiki"); 9 }10 阅读全文
posted @ 2013-05-09 23:32 ihge2k 阅读(161) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1907思路:尼姆博弈变形。View Code 1 #include<iostream> 2 using namespace std; 3 4 int main(){ 5 int _case; 6 scanf("%d",&_case); 7 while(_case--){ 8 int n,x,sum=0,count=0; 9 scanf("%d",&n);10 for(int i=1;i<=n;i++){11 ... 阅读全文
posted @ 2013-05-09 19:47 ihge2k 阅读(249) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3987思路:我们知道最小割是不唯一的,这里要我们求割边最少的最小割,比较好做法有:第一种:建边的时候每条边权 w = w * (E + 1) + 1;这样得到最大流 maxflow / (E + 1),最少割边数 maxflow % (E + 1) 道理很简单,如果原先两类割边都是最小割,那么求出的最大流相等但边权变换后只有边数小的才是最小割了乘(E+1)是为了保证边数叠加后依然是余数,不至于影响求最小割的结果第二种:建图,得到最大流后,图中边若满流,说明该边是最小割上的边 再建图,原则:满流的边改 阅读全文
posted @ 2013-05-09 14:57 ihge2k 阅读(744) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2149首先介绍一下巴什博奕(BashGame):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。分析:显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获 阅读全文
posted @ 2013-05-09 14:21 ihge2k 阅读(383) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3452思路:一颗带边权的树,最小割求树根和叶子结点不连通。可设汇点为n+1,注意只用叶子结点才能和汇点连容量为inf的边。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<set> 6 using namespace std; 7 #define MAXN 2222 8 #define MAXM 阅读全文
posted @ 2013-05-09 13:58 ihge2k 阅读(220) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1579所谓记忆化,简单理解就是dfs+dp,水题不多说了。。。View Code 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 55 6 int dp[MAXN][MAXN][MAXN]; 7 8 //记忆话搜索 9 int dfs(int a,int b,int c){10 if(a20||b>20||c>20)return dfs(20,20,20);12 if(dp[a][b][... 阅读全文
posted @ 2013-05-09 12:57 ihge2k 阅读(274) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2151View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 111 6 int dp[MAXN][MAXN]; 7 //dp[i][j]表示第i分钟在第j棵树时的方案数 8 //dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1]; 9 10 int main(){11 int n,m,p 阅读全文
posted @ 2013-05-07 23:19 ihge2k 阅读(235) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3251思路:选择1为源点,n+1为汇点,然后原图中每条边为新图的边,容量为边权,最后将每个可以选择的点与汇点连接,容量为点权,这样跑一遍最大流之后,求出最小割,然后所有的总收益减去最小割就是可能的最大收益了。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 1111 6 #define MAXM 44 阅读全文
posted @ 2013-05-07 22:39 ihge2k 阅读(338) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3657思路我就不详细讲了,这位大牛讲的很清楚:http://blog.csdn.net/cold__v__moon/article/details/7924269View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define MAXN 55 5 #define MAXM 55*55 6 #define inf 1<<30 7 using namespace 阅读全文
posted @ 2013-05-07 17:16 ihge2k 阅读(458) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4394思路:n的个位可以由m的个位确定,n的十位可以由m的个位和十位确定,以上同理,故直接bfs搜索就可以,先搜个位满足要求的,然后在满足要求的个位上扩展到十位上(其实就是就是在个位数前加个数,变成2位数)。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<cmath> 6 using name 阅读全文
posted @ 2013-05-07 14:28 ihge2k 阅读(287) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1240思路:就是一个简单的bfs,但我搞了好久啊,有一个trick一直没注意到,然后第二组数据就一直过不了。。。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<cmath> 6 using namespace std; 7 #define MAXN 17 8 char map[MAXN][MA 阅读全文
posted @ 2013-05-06 22:45 ihge2k 阅读(290) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1354思路:最麻烦的就是字符串处理了,但sscanf函数功能相当强大,orz....然后dfs就可以了,但才过了18个人。View Code 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 #define MAXN 333 8 struct Node{ 9 int f1,f2;10 }C[MAXN];11 char str[MAXN];12 int path[MAXN];13 b... 阅读全文
posted @ 2013-05-06 20:57 ihge2k 阅读(182) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3491思路:由于每个城市顶点都具有权值,所以对于每个城市拆成两个点u和所对应的u',之间连容量为w的边,S,H两点不会算在最小割中,所以将这两点拆点,拆点后容量为无穷,添加源点vs(0)和汇点vt(2*n+1),加边(vs,s,INF)和(t+n,vt,INF),对于两相连的城市,用其中一个点的第二个点去连另一个点的第一个点,边流量为无穷大,然后求解最大流即可.View Code 1 #include<iostream> 2 #include<cstdio> 3 #i 阅读全文
posted @ 2013-05-06 11:42 ihge2k 阅读(160) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4292思路:为了控制一个人只连一瓶饮料,一份食物,那么我们可以把一个人拆成两个,他们之间连一条权值为1的边,另外左边连它喜欢的食物,权值为1,右边连它喜欢的饮料,权值为1,在起点连食物的时候加流量限制,终点加流量限制,跑一遍最大流即可。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 1111 6 # 阅读全文
posted @ 2013-05-05 22:15 ihge2k 阅读(557) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1565http://acm.hdu.edu.cn/showproblem.php?pid=1569先理理概念:点覆盖集:无向图G的一个点集,使得该图中所有边都至少有一个端点在该集合内。最小点权覆盖集:在带点权无向图G中,点权之和最小的覆盖集。点独立集:无向图G的一个点集,使得任两个在该集合中的点在原图中都不相邻。最大点权独立集:在带权无向图G中,点权之和最大的独立集。定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集思路:1. 先染色,取一个点染白色,和它相邻的点染 阅读全文
posted @ 2013-05-05 20:37 ihge2k 阅读(1137) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046思路:最小割的入门题,设源点为0,汇点为n*m+1,源点与点为2的连一天容量为inf的边,汇点与点为1的连容量为inf的边,每个相邻网格连容量为1的边。View Code 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define MAXN 44444 6 #define MAXM 555555 7 #define inf 1< 阅读全文
posted @ 2013-05-05 19:12 ihge2k 阅读(364) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4309思路:2^12枚举修复哪些桥,不修复的桥没有花费,连接的边流量为1,要修复的桥则计算花费,边的流量为无穷,建立最大流模型来求解,增加一个源点S(0),和一个汇点T(n+1)。S向每个有人的点,连一条容量为人数的边,图中普通的u->v的有向边,连一条u->v的流量为无穷的边,对于u->v的隧道,可以连接u->v的流量无穷的边,和u->T的流量为隧道人数上限的边,求解最大流即可;ps:枚举状态用递归即可。View Code 1 #include<iostream 阅读全文
posted @ 2013-05-05 12:54 ihge2k 阅读(457) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998思路:可以用n*log(n)的做法求出最长上升子序列,然后删除原数组中的这些数,再求最长上升子序列(如果长度减小,则直接退出)。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 #define MAXN 22222 8 阅读全文
posted @ 2013-05-05 09:05 ihge2k 阅读(2120) 评论(2) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4143思路:变方程为n=(y-x)*(y+x)(n>0);令y-x=i,于是有y+x=n/i;从而联立不等式可求的x=(n/i-i)/2(x>0);从而i<=sqrt(n);枚举即可。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 7 int main(){ 阅读全文
posted @ 2013-05-05 08:07 ihge2k 阅读(160) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3416思路:就是先求一次最短路,最短路我们可以用spfa求出,然后取出最短路上的边建图,容量为1,最后一次SAP即可求出所有路径条数。View Code 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 #include<vector> 6 using namespace std; 7 #define MAXM 333333 8 # 阅读全文
posted @ 2013-05-05 00:16 ihge2k 阅读(610) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3277思路:3081差不多,就是多了每个女孩可以另外选任意k个不喜欢的,将每个女孩u分为u1,u2,若u喜欢v则加一条u1到v的边 否则加一条u2到v的边,令加u1到u2的容量为k的边;然后不知道为什么,wa了一下午,哎。。。以下是wa代码,不知道哪儿有bug.View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define 阅读全文
posted @ 2013-05-04 17:19 ihge2k 阅读(338) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081思路设源点为0,汇点为2*n+1,对没吵过架的女生和男生连容量为1的边(这里要用到并查集,每个女生的朋友也可以和该男生连边),然后就是源点与女生连边,容量为mid(0<=mid<=n),男生与汇点也连容量为mid的边(这里的mid即为为每个男孩和女孩找到了k个不同的伴侣,说明游戏可以进行k轮,附上链接:http://blog.csdn.net/qq564690377/article/details/7857983),然后就是二分搜索了。View Code 1 #include< 阅读全文
posted @ 2013-05-04 11:30 ihge2k 阅读(846) 评论(0) 推荐(0)
摘要:题目链接:http://www.codeforces.com/problemset/problem/5/C思路:如果str[i]=='(',那么入栈;否则如果str[i]==')',我们用一个p来保存i的位置;否则就是str[i]==')'的情况了,首先当然是出栈了,然后就是求更新。具体就代码:View Code 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<stack> 5 using namespac 阅读全文
posted @ 2013-05-03 23:39 ihge2k 阅读(199) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605题意:世界末日即将到来,地球上有n个人想转移到m个外星球,但是不同的人适应于不同的星球(1个人可适应多个星球),每个外星球都有人数的限制,现在给你星球人数的上限。还有每个人不同的适应情况。问,能否安排所有的人都成功地转移到外星球上。思路:多重匹配。。。View Code 1 #include 2 #include 3 #include 4 using namespace std; 5 #define MAXN 100000+10 6 #define MAXM 12 7 8 bool map.. 阅读全文
posted @ 2013-05-03 21:09 ihge2k 阅读(187) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553哎,不说了,打表过的,直接搜的话,TLE..View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 //#define MAXN 22 6 //int num[MAXN]; 7 //bool mark[3][MAXN]; 8 int sum,n; 9 10 /*11 void dfs(int row){12 if(row==n 阅读全文
posted @ 2013-05-03 19:27 ihge2k 阅读(160) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2883思路:这道和hdu 3572很像http://www.cnblogs.com/wally/archive/2013/05/03/3056726.html。这里也一样,我们选择0为源点,然后源点和顾客之间连边,容量为(ni*ti),然后,将每个顾客要求的时间区间看成点(由于区间可能覆盖),因此,我们可以直接对起始时间和结束时间进行排序,然后去掉重复的。这样假设我们排序后得到count个时间点,这样就有2*count-1个时间区间了,于是我们可以对每个时间区间与汇点连边,此时汇点为(vt=n+co 阅读全文
posted @ 2013-05-03 17:31 ihge2k 阅读(843) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3572先说一下题意:有M个机器,有N个任务。每个任务必须在Si 或者以后开始做,在Ei 或者之前完成,完成任务必须处理Pi 个时间单位。其中,每个任务可以在任意(空闲)机器上工作,每个机器的同一时刻只能工作一个任务,每个任务在同一时刻只能被一个机器工作,而且任务做到一半可以打断,拿去其他机器做。问:能否在规定时间内把任务做完。思路:建图是关键,我们可以选择0为源点,然后源点与每个任务都连一条边,容量为要求的天数p,然后每个任务都与相应的时间点连边,边容量为1,最后我们要确定汇点,汇点可以取vt=ma 阅读全文
posted @ 2013-05-03 15:12 ihge2k 阅读(1568) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549最大流基础题。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 22 6 #define inf 1<<28 7 int map[MAXN][MAXN]; 8 int pre[MAXN]; 9 int level[MAXN];10 int gap[MAXN];11 12 int SA 阅读全文
posted @ 2013-05-03 11:38 ihge2k 阅读(466) 评论(0) 推荐(0)
摘要:终于决定开始学习网络流了=.=<<图论算法理论、实践与应用>>那本书讲了很多关于求最大流的算法,然后我就只挑了一种传说中神奇的SAP算法学习。首先引入几个新名词:1、距离标号:所谓距离标号,就是某个点到汇点的最少的弧的数量(即边权值为1时某个点到汇点的最短路径长度)。设点i的标号为level[i],那么如果将满足level[i]=level[j]+1的弧(i,j)叫做允许弧,且增广时只走允许弧。2、断层(本算法的Gap优化思想):gap[i]数组表示距离标号为i的点有多少个,如果到某一点没有符合距离标号的允许弧,那么需要修改距离标号来找到增广路;如果重标号使得gap数组 阅读全文
posted @ 2013-05-03 11:05 ihge2k 阅读(3511) 评论(3) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1037理解了牛人的代码才明白的,花了一晚上的功夫,orz....跪dp.思路:dp[len[i][0]表示长度为len的以i开始的前两个下降的序列的个数,dp[len][i][1]表示长度为len的以i开始的前两个上升的序列的个数;则有dp[len][i][0]+=dp[len-1][j][1](j<i);dp[len][i][1]+=dp[len-1][j][0](j>i);预处理之后,把序列求出来就可以了(这是难点);做法:由于不知道开始是上升还是下降,这一开始枚举,确定第1位的数,以及升降情况,然后我们就可以根据 阅读全文
posted @ 2013-05-02 23:20 ihge2k 阅读(1153) 评论(0) 推荐(0)
摘要:题目链接:http://www.codeforces.com/problemset/problem/4/B思路:一开始我看数据也不大,然后就dfs暴搜了一下,orz.....,TLE,然后看了别人的贪心策略,佩服得五体投地啊!!!可以先把Min,Max求出来,然后从第一个MAX[i]开始减,边界条件为MAX[i]>MIN[i]&&r>sum;View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 i 阅读全文
posted @ 2013-05-02 20:14 ihge2k 阅读(174) 评论(0) 推荐(0)
摘要:题目链接:http://www.codeforces.com/problemset/problem/3/D思路:贪心+调整,?就改成')',如果加了')'后发现右括号比左括号多,就将花费小的括号变成'(',(采用优先队列,默认排序是从大到小);View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 typedef long long 阅读全文
posted @ 2013-05-02 18:35 ihge2k 阅读(166) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3979思路:我们可以从2只monster入手,假设a1和a2的总攻击力为v,杀死a1需要时间t1,a1的atk为c1;杀死a2的时间为t2,a2的atk为c2;如果先攻击a1,那么受伤值为t1*v+(v-c1)*t2;如果先攻击a2,那么受伤值为t2*v+(v-c2)*t1;假使t1*v+(v-c1)*t2<t2*v+(v-c2)*t1;即t1*c2<t2*c1;直接根据这个排序即可。View Code 1 #include<iostream> 2 #include<c 阅读全文
posted @ 2013-05-01 11:34 ihge2k 阅读(189) 评论(0) 推荐(0)
摘要:题目链接:http://www.codeforces.com/problemset/problem/3/B思路:不错的贪心题,我们可以先按体积升序排,体积相同的体积为1的升序排,体积为2的降序排,这样选择的时候就能最优。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<string> 6 using namespace std; 7 #define MAXN 100000+10 8 阅读全文
posted @ 2013-05-01 09:46 ihge2k 阅读(210) 评论(0) 推荐(0)