原创 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;

原创 poj3271Lilypad Pondg

先預處理出每個點能到的需要建荷花的地方,把中間走的步數省略了,這樣再最短路到終點就是最少需要建的荷花數。 至於方案數,只要把上一個點的方案數加起來就好了。 #include<stdio.h> #include<string.h> #inc

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

典型的bfs我還做了這麼半天。。。 注意:本題是強制轉換!!! #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespa

原创 USACO 2009 Open Gold 2.Work Scheduling

類似貪心,在前i 時間內那i 個價值最大的。但不能完全用貪心解,因爲有時間限制。 比如: 4 4 19 1 5 1 1 4 3 如果按v 排序的話最大時間限制爲4, 則4 個都能取,但實際上(1,1)不能取。 #include<stdi

原创 Bronze Lilypad Pond, 2007 Feb usaco

標準寬搜 #include<stdio.h> #include<queue> using namespace std; int m,n,m1,n1; int dir[8][2]; int map[50][50]; int sx,sy; i

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

一眼就dp f [ i ][ j ][ k ]表示大寫有I 個小寫有j 個且最後一個字母爲k 時的個數。f [ i ][ j ][ k ]=f [ i ][ j ][ h ],h 爲k 前一個字母。如果一一列舉每個字母,一定會TLE的,而

原创 bzoj2708木偶(dp)

dp問題。 設f [ i ]表示前 i 個數裏最多能扔多少個,f [ i ]=max(f [ i ], f [ j ]+find(j+1, i )); 這裏的find表示從第j+1個數到第i個數最多扔掉幾個,採用枚舉扔的個數,若在扔的一堆

原创 Building A Fence, usaco 2008 Oct

不能構成四邊形的情況就是三邊之和小於等於第四邊,所以每邊< n/2。 枚舉其中兩邊,若剩下兩邊之和w<n/2,ans+=w-1,否則ans加可行的中間區間。。。搞一搞就出來了。 #include<stdio.h> #include<alg

原创 Cheering up the Cows,2008nov,usaco

那道題搞一搞會發現在選好的n-1 條邊上,每條邊走兩次,還需要花掉兩個端點需要的時間,才能回到原點。那麼我們不妨把每個邊權設成路長*2+兩個端點的時間,這樣建最小生成樹就可以了。還有,回到出發點還要加上出發點的值。 #include<st

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

拿到題就想到強連通分量和最小生成樹,腫麼搞都是RE或MLE,結果這只是一道prim最小生成樹。。。 把已給邊賦值爲-1,這樣每次在選邊時就先選它了。 #include<stdio.h> #include<string.h> #inclu

原创 poj3615Cow Hurdles(floyd)

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define inf 9999999 int n,m,t; int map[50

原创 poj3045Cow Acrobats(貪心)

一看到最大值最小就想到了二分答案,但是呢?然後呢?(如果有人想明白爲什麼這個不能用二分答案能不能指點一下呢^-^) 好吧,最後看了題解是貪心。 假設現在的隊列是已經排好的,那麼取其中任意兩個位置i ,j (i<j),i處的壓力等於前面重量

原创 bzoj1721 [Usaco2006 Mar]Ski Lift 纜車支柱(dp)

f [ i ]表示前 i 個柱子最少選f[ i ]個,維護斜率。 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef

原创 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])%m

原创 歐拉函數

直接求一個數的歐拉函數 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==