- 博客(62)
- 资源 (1)
- 收藏
- 关注
原创 poj 3686 The Windy's
题意:n个工件,m个工场,第i个工件如果在第j个工场加工的时间为z[i][j],每个工场可以任意加工一个工件,但是同一时刻只能加工一个且一旦开始加工,且这个工件必须要加工完才能停止,求n个工件最小的平均结束时间。 (1 ≤ N,M ≤ 50)题解:假设一台机器J要完成K个工件,这K个工件单独在J机器完成时间为t1,t2,...,tk(顺序为1~K),则这K个工件总用时=t1*k+t
2013-02-03 18:40:50
823
原创 poj 3249 Test for Job
【题意】n个点m条有向边,每个点有一个权值v[i],求一条从入度为0的点到出度为0的点路径上的经过所有点权值之和最小值。保证:t is guaranteed that each road appears exactly once, and there is no way to return to a previous city. (实际上是告诉无环)1 ≤ n ≤ 100000
2013-01-20 17:25:46
726
原创 UVA 11426
【题意】求sum(gcd(i,j),11【题解】1.建立递推关系,s(n)=s(n-1)+gcd(1,n)+gcd(2,n)+……+gcd(n-1,n);2.设f(n)=gcd(1,n)+gcd(2,n)+……+gcd(n-1,n)。gcd(x,n)=i是n的约数(x而gcd(x,n)=i等价于gcd(x/i,n/i)=1,因此g(n,i)等价于phi(n/i).phi
2013-01-19 21:42:39
2564
原创 UVA 11361 Investigating Div-Sum Propertyt
【题意】给定a,b,p求出the number of integers in the range [A, B] which is divisible by p and the sum of its digits is also divisible by p.1 A B < 2^31 and 0p【题解】这个题最大的坑人之处在于,在p>=100时答案一定是0!!(
2013-01-19 17:09:04
1459
原创 UVA 11806 Cheerleaders
【题意】n行m列网格放k个石子。有多少种方法?要求第一行,第一列,最后一行,最后一列必须有石子。【题解】利用容斥原理。可以转到求“第一行、第一列、最后一行、最后一列没有石子”的方案数。枚举各个集合的组合时可以借助二进制进行枚举【Code】#include#include#includeusing namespace std;int n,m,sec,k;int C[
2013-01-18 22:29:03
2730
原创 UVA 11401 Triangle Counting
【题意】从1-n中选出3个不同的数组成最大边长不超过n的三角形,问有多少种方案?n【题解】计数问题首先可以建立递推式,设f[i]表示最大边长不超过i的三角形的个数,则有f[i]=f[i-1]+solve(i)。solve(i)表示最大边长为i的三角形个数,这是此题关键点。根据x+y>z,得:x-yy=1时,z可能值、有1个。依次类推,y=x-1时,有x-2.根据求和公式
2013-01-18 21:22:19
1174
原创 UVA 11538 Chess Queen
【题意】给定一个棋盘,在棋盘上放两个皇后(一百一黑),求使得两个皇后相互攻击(在一行、一列或对角线)的方案数。0106【题解】计数问题,分类:1.在一行或一列:n*m(m-1),m*n*(n-1)2.在对角线,假设nn-m+1个n。假设长度为l,则该对角线的方案数:l*(l-1)。将所有的加起来即可。【Code】#include#include#incl
2013-01-18 18:08:00
1670
原创 ZOJ 2614 Bridge
【题意】修建一座桥。桥上等距离放着若干个塔,塔高H,宽度不计。相邻两座塔之间的距离不能超过D。他之间的绳索形成全等的对称抛物线。桥长B,绳总长L,求建最少塔时绳索最下端离地高度y。【题解】需要用到微积分的一些东西。最大划分数为:if(B%D==0) n=B/D;else n=B/D+1;则可求出每段宽度和每段弧长:w=(double)B/(2.0*n);
2013-01-16 10:41:14
668
原创 UVA - 10341 Solve It
【题意】Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 x .where 0 p,r <= 20 and -20 q,s,t <= 0【题解】注意:在给定0 x <= 1,0 p,r <= 20 an
2013-01-15 21:32:26
1068
原创 CodeForces 127D Password
题意:从一个串s中找出一个最长的子串t,该字串满足:1.t是s的前缀2.t是s的后缀.3t在s串中即不是前缀也不是后缀Print the string t. If a suitable t string does not exist, then print "Just a legend" without the quotes.inpu
2012-12-30 12:23:36
630
原创 Codeforces 127C Hot Bath
题意:给出整数t1,t2,x1,x2,t0,和公式,(1 ≤ t1 ≤ t0 ≤ t2 ≤ 106, 1 ≤ x1, x2 ≤ 106).求满足(0 ≤ y1 ≤ x1, 0 ≤ y2 ≤ x2)此条件的y1,y2使得t最接近t0,但要保证t>t0.输出y1,y2.多种方案时输出最大的y1,y2.题解:不4个特判必WA。不过这4个特判不太容易想全。case 1:t1==t0 && t2
2012-12-28 20:34:02
1147
原创 poj 2337
题目要求使用所有的单词一次构成一个长链,首位相接的条件是字母相同。然后就想到了欧拉路。把每个单词看作一条有向边,首字母和尾字母看成两个点,然后建图即可。判定是否存在欧拉路时,先用并查集判定图是否联通。然后利用定理判断是否存在欧拉路:有向连通图D是欧拉图,当且仅当该图为连通图且D中每个结点的入度=出度;有向连通图D含有欧拉通路,当且仅当该图为连通图且D中除两个结点外,其余每个结点的入度=出度,且此两
2012-12-26 18:58:23
920
原创 poj 3680 intervals
ti#include #include #include #include #include #include #include #include #include #include #include using namespace std;int sumFlow;const int MAXN = 10010;const int MAXM = 1000200
2012-12-05 22:16:58
498
原创 POJ2446 Chessboard
题目大意:n*m的网格,其中有k个格子为漏洞,不能放东西。问你用1*2的格子能不能把网格放慢。题解:二分图匹配问题需要自己建立二分图。位于(i,j)的格子,可以与上,下,左,右的格子连边。如果(i+j)为偶数,那么他连向的格子的(i1+J1)一定为奇数。根据i+j的奇偶性可以把格子分成两个集合,而且为每个集合中的格子不会相连,这样就形成了一个二分图。然后用匈牙利算法求解即可。如
2012-12-03 23:16:43
756
原创 Usaco2010 Dec Treasure Chest
题目大意:n个硬币从左到右,第i个价值为Ci,A和B轮流拿硬币,但是每次只能从两边拿硬币。A先开始拿,两个人都采取最优策略,问A最多可拿到多少硬币?(n题解:博弈dp设f[i][j]表示从区间[i,j]得到的最大价值,则有:f[i][j]=max(a[i]+sum[i+1][j]-f[i+1][j],a[j]+sum[i][j-1]-f[i][j-1])理解如下:对[i,j]区间,
2012-12-02 17:54:01
1446
原创 UVa 11021
题目大意:k个虫子,每个虫子只能活一天。在虫子死时有pi的概率生出i个新虫子(0(注意:虫子在m天之前死光也算)题解:独立+全概率公式k个虫子死亡相互独立,所以考虑一个虫子:m天后全死光的概率f(m)则有:f(i)=p(0)+p(1)*f(i-1)+p(2)*(f(i-1)^2)+...+p(n-1)*(f(n-1)^(n-1))即按照生几个后代分类,做到了不重复,
2012-11-18 20:01:51
1131
原创 UVA - 11991 Easy Problem from Rujia Liu?
题意:问你序列中某个数v出现第k次时的位置。(序列长度小于10万)题解:F1:利用C++的STL//使用map+pair做到二维数组暴力查找效果#include#include#include#include#includeusing namespace std;map,int>mymap;int num[1001001];int main(){ int
2012-11-09 19:50:21
939
原创 hdu 3681
题解:bfs预处理+二分答案+dp验证f[i][j]表示当前在i点,访问了集合j中的点的最大剩余电量。一开始求最短路用floyd求一直T,后来才发现用最多15次BFS就可以求出来。#include#include#include#include#includeusing namespace std;const int dx[5]={0,1,0,-1,0};const
2012-10-23 20:40:21
835
原创 poj 2886 Who Gets the Most Candies?
题解:约瑟夫还+反素数约瑟夫还:线段树处理发素数:dfs这个题dfs时,不加上限会超过int#include#include#includeusing namespace std;const int maxn=500100;int prime[13]={1,2,3,5,7,11,13,17,19,23};struct TREE{ int l,r;
2012-10-21 12:58:36
656
原创 zoj 3662 Math Magic
题解:分解质因子后进行状态压缩DP。由于内存限制,可以使用滚动数组。一开始用long long竟然给T了。#include#include#includeusing namespace std;const int mod=1000000007;int f[1200][100];int p[1200],pnum,numy;int a[1200],prime[1200],
2012-10-16 19:29:56
900
原创 poj 2828 Buy Tickets
题解:不错的题倒序处理,空格的个数就是要插入的位置。数状数组+二分查找O(nlogn*logn)#include#include#includeusing namespace std;const int maxn=201000;int tree[maxn];int n;int pos[maxn],val[maxn];int ans[maxn];inline int l
2012-10-13 14:49:05
452
原创 UVA 5713 Qin Shi Huang's National Road System
题解:类似最小生成树,先做最小生成树然后枚举顶点,删边和加边。#include#include#include#include#includeusing namespace std;const int maxn=1010*1010;struct NODE{ int u,v; double w; bool operator < (const NODE &a) cons
2012-10-13 10:41:17
1112
原创 hdu 4123 Bob’s Race
题解:三个模板的叠加:求树中一个点的最远距离(DP)+最值(RMQ)+单调性这个题值得注意的地方是:log函数很慢,需要预处理。#include#include#include#include#include#includeusing namespace std;int n,m;const int maxn=51000;int max1[maxn],max2[
2012-10-12 12:00:37
1592
原创 poj 2155 Matrix
题解:方法1:二维线段树。方法2:经过一定转换之后可以转变为:点修改,区间查询,然后判断奇偶性的题目,可以写一个二维树状数组。具体的可以去看09年国家集训队武森《浅谈信息学竞赛中的“0” 和“ 1”》的论文#include#include#includeusing namespace std;long long tree[1010][1010];int n;inline
2012-10-06 16:44:01
879
原创 hdu 3757 Evacuation Plan
题解:分别对人和shelter从小到大排序之后再dp,这样可以消除后效性。设f[i][j]表示第i个人放在第j个遮蔽物里,则有:f[i][j]=min(f[i-1][j],f[i-1][j-1])+abs(x[i]-y[j]);可以使用滚动数组将维,降低空间复杂度。需要注意的是,最后输出时还要再排序回来输出。#include#include#include#include
2012-10-06 16:18:28
1108
原创 poj 3067 Japan
题解:这个题在按照x从小到大y从小到大排序后,实际上是求逆序数。使用数状数组即可。#include#include#include#includeusing namespace std;long long tree[1010];int n,m,k;struct node{ int x,y;}a[1000010];inline int lowbit(int x)
2012-10-06 11:37:46
826
原创 poj 1195 Mobile phones
题解:标准的二维数状数组#include#include#includeusing namespace std;int tree[1300][1300];int s;inline int lowbit(int x){ return x&(-x);}void add(int x,int y,int c){ for(int i=x;i<=s;i+=lowbi
2012-10-05 20:18:01
405
原创 poj 3321 Apple Tree
方法:树上不好直接统计和更新。树转序列,再用数状数组。#include#include#includeusing namespace std;int tree[500000],b[500000],e[500000];bool v[500000],h[500000];int limit;struct node{ int x,next;}a[500000]
2012-10-05 16:47:09
1092
原创 hoj 2430 Counting the algorithms
题解:这个题的关键在于:如果是两个包含的区间则先删除外边的最优。如果是交叉区间的情况,无论先删哪个,答案都是一样的。所以采取如下策略,从左边向右边,一个一个删除。至于统计动态的两个相邻元素之间的数目,可以使用树状数组。时间复杂度O(nlogn)#include#include#includeusing namespace std;const int maxn=200010;
2012-10-05 16:25:18
931
原创 zoj 3583 Simple Path
题意:给定一个无向图,输出不在s到d的简单路径上的点题解:1方法1dfs先删点,然后从(前提:删除的不是s且s没有被拜访)s搜一次,再从(前提:删除的不是d且d没有被拜访)d搜一次,搜不到的点就是不再s到d简单路径上的点。一开始错在这个图上了:从0到40 10 20 30 4#include#include#includeusing namespa
2012-10-05 10:21:25
1079
原创 hdu 4055Number string
题解:f[i][j]表示前(1~i)的排列,末位为j满足条件的方案数。当s[i-2]=='D'时,有f[i][j]=f[i-1][j]+f[i-1][j+1]+...+f[i-1][i-1];当s[i-2]=='I'时,有:f[i][j]=f[i-1][1]+。。。f[i-1][j-1];当s[i-2]=='?',为上述两个相加。这个递推式加一个辅助数组可以从O(n^3)将到O(n^2)。这个题关
2012-10-05 09:15:39
703
原创 区间问题汇总
1.区间调度问题1076Gene Assembly将所有区间按右端点坐标从小到大排序,顺序处理每个区间。如果它与当前已选的所有区间都没有重叠,则选择该区间,否则不选。#include#include#includeusing namespace std;struct node{ int l,r,num;}a[10000];int b[10000],
2012-09-27 19:28:54
760
原创 hdu 4283
题解:这个题第一开始做的时候根本没想到区间dp,用的贪心结果一直WA。设f[i][j]表示区间i到j所能获得的最大值,然后进行dp即可。本着一个原则是:i在第x次去舞台时,只考虑对本区间内的数的影响。#include#include#includeusing namespace std;int a[110],f[110][110],s[110];int dp(int x,in
2012-09-24 21:32:07
492
原创 hdu 4405 Aeroplane chess
题解:递推题+并查集用小数据分析一下,可以看出有递推式:e[find(i+1)]=(e[i]+p[i])/6.0;p[find(i+1)=p[i]]/6.0;find(i+1)是i可以走的一个点,如果是跳跃点的话跳跃到最后。#include#include#includeusing namespace std;const int maxn=100010;int f
2012-09-22 21:01:02
628
原创 zoj 3620 Escape Time II
题目大意:给你n个点(题解:一道非常好写的搜索题,但是关键需要你想到合理的搜索方案。我的dfs关键之处如下:1.按照边来搜,flag[i][j]标记是否走过从i到j的这条边,看作有向边来搜索。2.已经搜过的点val置为0,dfs完之后再置回来,这样可以防止一个点被加了多次。#include#includeusing namespace std;int n,m,
2012-09-16 11:09:24
552
原创 temp
hdu 3652#include#includeusing namespace std;int pow[15],num[15];int f[15][15][15][3];int dfs(int l,int pre,int k,int flag,int e){ if(l==-1) return (k==0)&&flag; if(!e && f[l][p
2012-09-14 19:36:03
488
原创 hdu4268 Alice and Bob
题目大意:Alice和Bob有n个长方形,有长度和宽度,一个矩形可以覆盖另一个矩形的条件的是,本身长度大于等于另一个矩形,且宽度大于等于另一个矩形,矩形不可旋转,问你Alice最多能覆盖Bob的几个矩形? (N 题解:先按照x排序,先保证在x满足条件的情况下,对b[i].y(Bob)进行查找,找到最接近a[i].y(Alice)的值,删除他。总之就是先保证一维有序这样可以O
2012-09-08 19:59:38
1809
原创 HDU 3658 How many words
题目大意:从小写字母和大写字母里选出m个字母(可重复选择),组成一个单词,选字母时需要满足以下规则:1.相邻字母ASCII值的差值2.选择的单词中至少有一对字母ASCII值的差值恰好等于32.问你可以组成多少个不同的单词。输出最后的结果mod 1000000007其中:(2 ≤ m ≤ 109)题解:如果我们不考虑第二条规则和数据范围,可以推出如下递推式,设f[
2012-09-07 17:00:43
632
原创 hdu 4022 Bombing
题目大意:给你n个点的坐标(xi,yi),然后再给你m个炸弹,每个炸弹描述如下:两个数:c,d,c=0时表示把x坐标等于d的点全部销毁,c=1表示把y坐标等于d的点全部销毁。题目问你每个炸弹能销毁几个点(已经被其他炸弹销毁的不能再销毁)。(N(M109题解:数据量比较大,可以看出应使用O(nlogn)的算法。map+set+pair如果你能想到C++的STL这个题目就比
2012-08-30 22:43:24
626
原创 zoj 3633 Alice's present
题目大意:给你n个数,第i个数为a[i],然后给出m,接着m行,每行有两个数u,v表示询问[u,v]这段区间是否有重复的数,没有输出“OK”,有的话,输出从区间右边向左看起,第一个出现次数等于2的数。( 3≤ n ≤ 500,000)( 1≤ uv≤ n )(a[i]2^31-1)题解:1.离线做法:将区间按照右端点从小到达排序,然后开3个指针,l,r,x从右向左扫描,当发
2012-08-29 10:25:56
1434
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人