Time of Update: 2018-12-06
糾結一晚上,注意細節啊!!!(看到有很多解題報告都用<queue>,我不太喜歡用STL的東西。。。)My Code:#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 51;struct node{int x;int y;int z;int t;}q[N*N*N];int d[6][3] = {{1, 0, 0}, {-1
Time of Update: 2018-12-06
結構體中定義記錄染色次數的參數(cov),更新時直接找到對應的區間,使cov++。查詢時要有點小操作。查詢過程:void query(當前節點 t,要查詢的點 x){ if(找到要查詢的點) return cov; if(該點的cov > 0) { 左孩子.cov += 當前節點.cov; 右孩子.cov += 當前節點.cov; 當前節點.cov = 0; }
Time of Update: 2018-12-06
背包問題,發現這個東西很靈活。看來還是不夠理解啊。#include <stdio.h>#define N 1024struct knap{int w;double v;}a[N];float dp[N*10+7];int main(){int n, m, i, j;while(scanf("%d%d", &n, &m) != EOF) {if(!n && !m)break;for(i = 1; i <= m; i++)
Time of Update: 2018-12-06
去你妹的並查集,沒糾結死我!按速度排序,然後枚舉所有的路,知道find(start) == find(end)結束。然後用最大值減去最小值,求其差,取差最小。Code:#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int N =
Time of Update: 2018-12-06
/*題意:求【1 to 10^9】範圍內各位元字之和為s的數的個數; 思路:定義dp[i][j] (i = 1 to 9, j = 1 to 81),表示位元為i的數各位元之和為j的數的個數。dp[i][j] = (i - 1位元最低位全部補0) + (i - 1位元最高位補j - k {k| 1 <= k <= 9} )。所以轉移方程就是 dp[i][j] = dp[i-1][j] + sum(dp[i-1][j - 1] , dp[i-1][j-2] , ... ,
Time of Update: 2018-12-06
poj上1A, HDU上6A,我暈啊!注意幾點:1、多組資料;2、memset(c, 0, siezeof(c));3、memset(ans, 0, sizeof(ans));my code:View Code #include <stdio.h>#include <string.h>#define N 32010int c[N], n, ans[N];int lowbit(int i){return i&(-i);}void add(int i, int
Time of Update: 2018-12-06
這題的資料有點問題,給的N個數裡邊最大的數是多少不知道,直接猜了個數用hash做了,居然1A了。。。。#include <stdio.h>#include <string.h>#define N 100007int hash[N];int main(){int n, i, a;while(scanf("%d", &n) != EOF) { memset(hash, 0, sizeof(hash));int max = -1;while(n-
Time of Update: 2018-12-06
/*貢獻出無數WA, 就因為一個地方寫錯, 悲劇的一晚上啊!不過能過了還是很爽的。 思路:用Trie樹給字串重新標號,然後用並查集,用一個a[i] 記錄當前並查集跟結點上串連的結點數。*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct node{int flag; node * next[53];};const int N = 2000
Time of Update: 2018-12-06
一牛人說:母函數就是把費腦筋的事轉換成多項式計算。好吧,我承認母函數用好的話確實很神奇,比如說這個題。可以把n看成無限個可取用的1,2,3,4,5,,,m這些數組成的。然後就是可以寫成母函數的形式G(X) = (1 + X^1 + X^2 + X^3 + ...)(1 + X^2 + X^4 + X^6 + ...)(1 + X^3 + X^6 + ...)...然後就是類比多項式的計算過程。輸入的n是多少就計算到幾階,得到的X^n項的係數就是可能的情況數。 My
Time of Update: 2018-12-06
/*第一道樹形dp的題,感覺樹形dp就是在dp的基礎上加了樹這個環境,建樹——DFS。思想上還是基本的動態規劃思想(最優子結構,重疊子問題)。參考解題報告終於把這題做出來的。思路:dp[t][j]為以t為根的子樹,保留j條邊時的最優情況,map[i][j]為i結點到j結點構成的邊的權值。當t與一個孩子相連時:dp[t][j] = max(dp[L][j-1]+map[L][t], dp[R][j-1] + map[r][t]);當t結點與兩個孩子相連時:for(j = 0; j <=
Time of Update: 2018-12-06
母函數模板題,就是稍微改了一下。My Code:#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 307;int c1[N], c2[N];int main() {//freopen("data.in", "r", stdin);int n, i, j, k;while(cin >> n, n) {for(i = 0;
Time of Update: 2018-12-06
Warmup for 2011 Asia Regional Chengdu (Alibaba精英賽題目重現,SJTU命題)——Problem 1009 /*比賽沒做,周六下午做zoj的月賽做的想吐,周日一點心情也沒有。今天挺師兄說這題是dp的,就做了做。其實更像拓撲排序,大題思路就是把所有入度為0的點入棧,然後出棧。本體多組資料,WA了一晚上!妹的!*///My Code:#include <iostream>#include <cstdio>#include <
Time of Update: 2018-12-06
代碼+注釋:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int N = 100;int s[N];bool used[N];int cmp(int a, int b){return a > b;}bool dfs(int n, int u, int left, int
Time of Update: 2018-12-06
/*題意:對1到N這些數進行排列,1在最左邊,相鄰的兩個數之差不能超過2,求有多少種排列方法? 思路:已知1在最左邊,跟1相鄰的只能是2、3。當2跟1相鄰時後邊的部分就是dp[n-1] 。當3在1後邊,2在3後邊時,前三位確定,剩下的就是dp[n-3]。最後剩下一種情況,再加1。 dp[i] = dp[i-1] + dp[i-3] + 1;*/#include <iostream>#include <fstream>using namespace
Time of Update: 2018-12-06
求圖中任意兩點間的最短路徑,個人感覺用Floyd比較好,有人說這道題可以用SPFA,目前還沒有這方面的思路,先把Floyd的做法貼上,以後再補Floyd code:#include <iostream>#include <cstdio>using namespace std;const int inf = 100000000;const int N = 208;int dis[N][N];int n;void Floyd(){int i, j, k;for(k = 0
Time of Update: 2018-12-06
/*設原序列的逆序數為sum,每往後移一個數,可以找到規律sum += n-2*num[i]-1;(n為元素個數,num[i]為移動的數);求原序列的逆序數時可以用線段樹,每輸入一個數,先querry [輸入的數,n]中元素的個數,再把num[i]插入到線段樹中。。。*/#include <iostream>#include <cstdio>#include <cstring>#define L(x) x << 1#define R(x) x
Time of Update: 2018-12-06
開始沒整明白,還想用dfs遞迴求解,後來看了看解題報告的思路(貌似這題可以用dp),bfs一遍,用一個best[i]存放到i的最優解,最後直接輸出best[k]就行。第一次隊列數組開小(還是不想用<queue>)了,WA了一次。。。#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 100007;int
Time of Update: 2018-12-06
查SPFA的資料時偶爾看到一種運用,然後很淡定的敲之1A了15MS+328k code:#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 207;const int inf = 100000000;int vis[N], map[N][N];int dis[N], q[N];void spfa(int n, int
Time of Update: 2018-12-06
水題,但是要細心#include <stdio.h>#include <stdlib.h>#define N 10007int a[N], b[N];int cmp(const void * a, const void * b){return *(int *)a - *(int *)b;}int main(){int n, i;while(scanf("%d", &n) != EOF) {for(i = 0; i < n; i++)
Time of Update: 2018-12-06
/*按照母函數的思路,然後類比三個括弧相乘的過程。因為題目已經限定好了硬幣只能是1、2、5。所以可以寫成:(1 + X + X^2 + ...)(1 + X^2 + X^4 + X^6 + ...)(1 + X^5 + X^10 + X^15 + ...)其中三個括弧元素的個數分別是輸入的num_1, num_2, num_3。然後就是類比多項式相乘了。*///ps:代碼有點水,一步一步乘的,反正就三個括弧,費不了多大勁,^_^//My Code:#include <iostream&