自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 Gopher II(二分图最大匹配)

1538:Gopher II总时间限制: 2000ms 内存限制: 65536kB描述The gopher family, having averted the canine threat, must face a new predator. The are n gophers and m gopher holes, each at distinct (x, y)

2015-11-04 16:05:55 1063

原创 分成互质组

描述给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?输入第一行是一个正整数n。1 第二行是n个不大于10000的正整数。输出一个正整数,即最少需要的组数。样例输入614 20 33 117 143 175样例输出3来源2008年第十三届“华罗庚金杯”少年数学邀请赛 决赛第5题#include#

2015-11-03 23:29:52 4030 1

原创 乘积最大的拆分

将正整数n拆分为若干个互不相等的自然数之和,问如何拆分可以使得它们的乘积最大?小学奥数。。。(感到深深的惶恐)若答案里有1的话还不如把1加到最后,那么最少是2。若相邻两个差大于2,不如化成x[i]+1和x[i+1]-1,所以相邻两数之差不大于2。于是就从2开始找,直到加到i>=n若sum+i>n,答案从i-1往前一次加1,直到和为n#include#includeu

2015-11-02 23:53:24 2638

原创 codeforces 543A Writing Code (dp)

一开始想到的dp: f [ i ][ j ][ k ]表示前i个人打了j行有k个错误的方案数,那么转移方程为:f [ i ][ j ][ k ]=f [ i-1][ j-h ][ k-a[i]*h ] (0很明显超时+MLE。这时会发现转移只与f [ i-1 ]有关,可以通过降一维来优化,删去第一维。f [ j ][ k ]=f [ j ][ k ]+f [ j-1 ][ k-a[i]

2015-11-01 23:02:30 695

原创 codeforces 590D Top Secret Task(dp)

状态:f [ i ][ j ]表示前i个点换了j次的最小和转移:用f [ i ][ j ]更新f [ i+1 ][ j+k-i-1](k为i后一点)#include#include#includeusing namespace std;int n,k,s;int a[200];int f[200][200*200];int main(){ scanf("%d %d %

2015-10-29 20:18:37 1288

原创 拓扑排序模板

在有向无环图中,通过找拓补序,可以从头到尾转移状态,比spfa少走了许多边。记录每个点的入度,每次遇到一个点其入度-1,直到入度为0,变成起始点。void tuobu(){ queueQ; for(int i=0;i<=n;i++) { if(ins[i]==0) { order[hh++]=i; dis[i]=1; Q.push(i); } }

2015-10-23 08:21:07 821 2

原创 计算空间

换算关系:1GB=1024MB1MB=1024KB1KB=1024Byte1Byte=8Bit一个字节等于八个位常用类型数据所占字节:int 4long long 8unsigned long long 8float 4double 8bool 1char 1

2015-10-20 13:08:09 903

原创 bzoj1688: [Usaco2005 Open]Disease Manangement 疾病管理(状压dp)

状压dp一直是弱项啊。。。#include#includeusing namespace std;int n,m,k;int val[2000];int f[1000000];bool check(int x){ int cnt=0; while(x) { cnt+=(x&1); x=x>>1; } if(cnt>k)return false; retur

2015-10-05 15:29:13 1372

原创 BZOJ1574 USACO 2009 Jan Gold 1.Earthquake Damage Solution

要想被截掉的点越少,最优方案就是不可行点周围的点都损坏。然后bfs一下求出从1能到达的点,剩下的就是不能的了。一定要注意:这是图,不是树!有可能有自环,有重边。#include#include#include#includeusing namespace std;struct node{ int to,next;}edge[200050];int num;int hea

2015-10-02 19:09:04 1123

原创 bzoj2442: [Usaco2011 Open]修剪草坪(单调队列优化dp)

正常的dp公式为dp[i]=max dp[j]+sum[i]-sum[j+1],(j+1不取,j在i-k-1~i-2),为了dp[i]最大,那么使dp[j]-sum[j+1]最大,用单调队列维护。#include#includeusing namespace std;typedef long long ll;ll n,k;ll a[100500],sum[100500];ll dp[1

2015-09-30 19:06:17 1519

原创 bzoj1628: [Usaco2007 Demo]City skyline(单调队列)

一看就好熟悉好熟悉啊!!!结果还是忘了。。。类似这种题呢就用单调队列。例如这道题维护单调递增队列,当下一个比它高,就要新建一个楼,但要是比前一个矮且在前面出现过,那么这个楼就不用再建了。#includeint n,l;int a[60000];int que[60000];int cnt;int main(){ scanf("%d %d",&n,&l); for(int i

2015-09-29 20:22:38 960

原创 bzoj1650: [Usaco2006 Dec]River Hopscotch 跳石子

当看到最小值最大或者最大值最小的时候,还是要先考虑二分啊。#include#include#includeusing namespace std;typedef long long ll;ll l,n,k;ll a[55000],s[55000];ll cmp(int x,int y){ return x<y;}bool check(ll x){ ll cnt=0;

2015-09-29 19:36:24 739

原创 bzoj1782: [Usaco2010 Feb]slowdown 慢慢游

应该是树上搜索,但因为顺序不同而且情况会改变,搜索回溯什么的并不好使。不过能发现,每一次更改对后面有影响,我们可以把影响记下来,用到线段树。先用dfs找一遍每个点影响的范围,每走一次整个区间都加1。还是需要画一画的。#include#include#includeusing namespace std;struct nn{ int to,next;}edge[2005

2015-09-29 18:48:50 785

原创 矩阵乘法(摆花)

摆花【问题描述】艺术馆门前将摆出许多花,一共有 n 个位置排成一排,每个位置可以摆花也可以不摆花。有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了。假定每种花数量无限,求摆花的方案数。【输入】输入文件名为(flowers.in)。输入有 1+m 行,第一行有两个用空格隔开的正整数 n、 m, m 表示花的种类数。接下来的 m 行,每行有 m 个字符 1

2015-09-28 19:53:20 1319

原创 bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛

状压dp#include#includeusing namespace std;typedef long long ll;ll n,m;ll a[20];ll f[20][1<<16];int main(){ scanf("%lld %lld",&n,&m); for(ll i=0;i<n;i++) { scanf("%lld",&a[i]); } for(l

2015-09-24 13:55:21 508

原创 分层图,bzoj2763: [JLOI2011]飞行路线

分层图,就是在图中dp,通常是有几条路免费。模板(2763: [JLOI2011]飞行路线)#include#include#include#includeusing namespace std;struct node{ int to,next,len;}edge[100005];int head[50005];int cnt;void add(int f,int t

2015-09-15 20:37:11 831

原创 bzoj1375[Baltic2002]Bicriterial routing 双调路径

分层图,dp。本题求的是多少种方案,不是多少个路径。。。dp[i][j]表示到第i点时用了j时间所花的钱数。注意:走过最长的路径是(n-1)*100,否则会爆!!!#include#include#include#include#includeusing namespace std;#define inf 2050typedef long long ll;int n

2015-09-15 20:05:49 881

原创 bzoj4247: 挂饰(01背包)

状态:f[ i ][ j ]表示选到第 i 个物品时还剩 j 个勾转移:f[i][j]=max(f[i-1][j-edge[i].gou+1>1?j-edge[i].gou+1:1]+edge[i].val,f[i-1][j]);注意要先按勾数排序#include#include#includeusing namespace std;struct node{ int g

2015-09-11 13:07:04 1469

原创 poj3159candies

差分约束建图,求1到n最短路要用栈spfa,否则会TLE。#include#include#include#includeusing namespace std;typedef long long ll;struct node{ ll to,next,len;}edge[150005];ll head[150005];ll cnt;void add(ll f,l

2015-09-08 13:10:25 558

原创 字符串hash,bzoj2795[Poi2012]A Horrible Poem

unsigned int BKDRHash(char *str){ unsigned int seed = 131; // 31 131 1313 13131 131313 etc.. unsigned int hash = 0; while (*str) { hash = hash * seed + (*str++); }

2015-09-06 20:14:33 955

原创 poj2010Moo University - Financial Aid

要录取n个,那中位数左右都会有(n-1)/2个。枚举中位数第i位,左右两边预处理出(i-1)前(n-1)/2个最小数的和,(i+1)后(n-1)/2个最小数的和。我用的是优先队列,好像还可以用堆。#include#include#include#includeusing namespace std;typedef long long ll;struct node{ ll

2015-09-04 20:51:42 511

原创 poj3271Lilypad Pondg

先预处理出每个点能到的需要建荷花的地方,把中间走的步数省略了,这样再最短路到终点就是最少需要建的荷花数。至于方案数,只要把上一个点的方案数加起来就好了。#include#include#include#includeusing namespace std;typedef long long ll;ll dir[8][2]={ 2,1, 1,2, 2,-1, -1,2,

2015-09-04 16:17:51 966

原创 poj1991Turning in Homework(dp)

状态f [ i ] [ j ] [ 0 ]表示在区间(i+1,j)中都未交作业,现在在 i 位置上,f [ i ] [ j ] [ 1 ]表示在区间(i,j-1)中都未交作业,现在在 j 位置上。状态转移:f[i][j][0]=min(max(f[i-1][j][0]+edge[i].x-edge[i-1].x,edge[i].t),max(f[i][j+1][1]+edge[j+1].x-e

2015-09-04 13:47:01 489

原创 bzoj1578Stock Market(dp)

每天能获得的最大钱数只与前一天有关。对于手里每只股票,前一天可以买或不买。那么每一天的收益就取决于前一天有多少钱,怎么买。我们就可以背包了,体积为前一天有的钱数,体积为该股票前一天的价值,利润为今天的价值。设best[ i ]为第i天的最大钱数。#includetypedef long long ll;#includeusing namespace std;#define inf

2015-09-01 14:38:27 605

原创 bzoj1721 [Usaco2006 Mar]Ski Lift 缆车支柱(dp)

f [ i ]表示前 i 个柱子最少选f[ i ]个,维护斜率。#include#include#includeusing namespace std;typedef long long ll;ll n,m;ll high[5005];ll f[5005];int main(){ scanf("%lld %lld",&n,&m); high[0]=0;

2015-08-29 16:18:42 1165

原创 USACO 2009 Open Gold 2.Work Scheduling

类似贪心,在前i 时间内那i 个价值最大的。但不能完全用贪心解,因为有时间限制。比如:44 191 51 14 3如果按v 排序的话最大时间限制为4, 则4 个都能取,但实际上(1,1)不能取。#include#include#includeusing namespace std;#define inf 100005typedef long long

2015-08-28 20:49:59 1011

原创 poj3615Cow Hurdles(floyd)

#include#include#includeusing namespace std;#define inf 9999999int n,m,t;int map[500][500];int main(){ scanf("%d %d %d",&n,&m,&t); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map

2015-08-28 19:54:45 449

原创 USACO 2011 Feb Gold 1.Cowlphabet(dp)

一眼就dpf [ i ][ j ][ k ]表示大写有I 个小写有j 个且最后一个字母为k 时的个数。f [ i ][ j ][ k ]=f [ i ][ j ][ h ],h 为k 前一个字母。如果一一列举每个字母,一定会TLE的,而且很惨。。。(本人惨了快一个小时了。。。)其实只要把每个字母对一一列举出来,也是可以的啊。#include#includeusing namespace

2015-08-28 19:31:03 504

原创 USACO 2011 Open Silver 1.Corn Maze (bfs)

典型的bfs我还做了这么半天。。。注意:本题是强制转换!!!#include#include#include#includeusing namespace std;struct node{ int x1,x2,y1,y2;}edge[30];int dir[4][2]={ 1,0, 0,1, -1,0, 0,-1};int n

2015-08-28 13:08:53 568

原创 Cheering up the Cows,2008nov,usaco

那道题搞一搞会发现在选好的n-1 条边上,每条边走两次,还需要花掉两个端点需要的时间,才能回到原点。那么我们不妨把每个边权设成路长*2+两个端点的时间,这样建最小生成树就可以了。还有,回到出发点还要加上出发点的值。#include#includeusing namespace std;struct node{ int from; int to; int len;

2015-08-27 19:22:51 616

原创 poj2184Cow Exhibition(01背包)

一看就是dp题,对于每头牛,只有取和不取两种情况,01背包。设f [ i ] 表示当智商之和为 i 时情商之和最多是多少。但智商之和有可能为负数,那么就加上一个常数。#include#include#includeusing namespace std;#define maxn 100005struct node{ int iq,eq;}edge[150];int

2015-08-26 20:33:04 499

原创 poj1990MooFest(树状数组)

拿到题我们只需要考虑v比这个数小的就可以了,ans = Σv [i] * 比这个数小的点到这个数的距离之和。那么这个距离之和怎么求呢?对于第 i 个数来说,设 front [ i ]  表示v[ j ] 比v [ i ] 小且 x[ j ] 比x[ i ] 小的 j 的个数,这些数的x 之和为tot;设sum为所有数中 v[ j ] 比v[ i ] 小的 j 的x 之和,cnt 为所有

2015-08-26 20:20:51 526

原创 bzoj2708木偶(dp)

dp问题。设f [ i ]表示前 i 个数里最多能扔多少个,f [ i ]=max(f [ i ], f [ j ]+find(j+1, i ));这里的find表示从第j+1个数到第i个数最多扔掉几个,采用枚举扔的个数,若在扔的一堆中能互相配对,在没扔的一堆中任意两个不能配对,就是可行的。#include#include#includeusing namespace std;

2015-08-24 13:48:03 586

原创 欧拉函数

直接求一个数的欧拉函数ll eular(ll x){ ll res=x; for(int i=2;i*i<=x;i++) { if(x%i==0) { res=res/i*(i-1); while(x%i==0) { x/=i; } } } if(x>1) { res=res/x*(x-1); } return res;}

2015-08-22 14:35:52 488

原创 Cow Frisbee Team, 2009 Mar,usaco

又是一个dp。倍数即余数为0。状态f[i][j]表示前i个数里加和余数为j的方案数。f[i][j]=(f[i][j]+f[i-1][j])%mod;f[i][(j+x)%m]=(f[i][(j+x)%m]+f[i-1][j])%mod;个人认为设状态比状态转移更不好想。状态最好设题目中出现的且范围不是很大的量。#include#define mod 100000000

2015-08-21 19:51:28 584

原创 Ski Lessons, 2009 Open,usaco

dp题f [i][j] 表示在第 i 分钟能力为 j 时最多滑雪次数,g [i] 表示第 i 分钟最多滑雪次数每分钟有三种状态:啥也不干:f[i][j]=f[i-1][j];滑雪:f[i][j]=f[i-ski[j]][j]+1;上课:f[i][j]=g[开始上课时间];对于这种情况,我们可以预处理一下。les[st+l-1][v]=max(les[st+l-1][v],s

2015-08-21 18:28:08 629

原创 poj3045Cow Acrobats(贪心)

一看到最大值最小就想到了二分答案,但是呢?然后呢?(如果有人想明白为什么这个不能用二分答案能不能指点一下呢^-^)好吧,最后看了题解是贪心。假设现在的队列是已经排好的,那么取其中任意两个位置i ,j (i再调换一下i,j,j处为Wq-s[j],i处为Wq+w[j]+Wm-s[i]。那么这个队列没有原来那个好,Wq+w[j]+Wm-s[i] > Wq+w[i]+Wm-s[j],即w[

2015-08-20 19:19:29 622

原创 Bronze Lilypad Pond, 2007 Feb usaco

标准宽搜#include#includeusing namespace std;int m,n,m1,n1;int dir[8][2];int map[50][50];int sx,sy;int ans[50][50];int vis[50][50];bool fun(int x,int y){ if(x>=1&&x=1&&y<=n)return true; retur

2015-08-20 12:56:20 792

原创 Building A Fence, usaco 2008 Oct

不能构成四边形的情况就是三边之和小于等于第四边,所以每边枚举其中两边,若剩下两边之和w#include#includeusing namespace std;int n;long long ans;int main(){ scanf("%d",&n); int t; if(n%2==0) { t=n/2-1; }else { t=n/2; } for(i

2015-08-19 20:04:35 649

原创 poj3625 Building Roads(最小生成树)

拿到题就想到强连通分量和最小生成树,肿么搞都是RE或MLE,结果这只是一道prim最小生成树。。。把已给边赋值为-1,这样每次在选边时就先选它了。#include#include#include#includeusing namespace std;#define inf 0x3f3f3f3fstruct node{ int x,y;}edge[1500];int

2015-08-19 18:47:06 512

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除