Time of Update: 2018-12-05
描述:給出n種長方體,每種長方體無數個,將這些長方體按照長和寬依次遞減的趨勢依次增加高度,求最大的高度是多少#include <cstdio>#include <cstdlib>int n,m,t,sum;int arr[100][3];int max(int x,int y){ return x>y?x:y;}void swap(int &x,int &y){ if(x>y) { int temp=x;
Time of Update: 2018-12-05
參考:http://hi.baidu.com/1093782566/blog/item/e5a0e9229913bd048b82a175.htmlhttp://www.cppblog.com/IronOxide/archive/2010/08/16/123622.html?opt=admin題目簡述:n頭奶牛,給出若干個歡迎關係a b,表示a歡迎b,歡迎關係是單向的,但是是可以傳遞的。另外每個奶牛都是歡迎他自己的。求出被所有的奶牛歡迎的奶牛的數目。模型轉換:N個頂點的有向圖,有M條邊(N≤100
Time of Update: 2018-12-05
/*很裸的朱劉演算法,後悔昨天比賽前沒看過朱劉演算法,掩面大哭~~抽象一個超級起點,連改點到每個點的單向邊,邊權為點自身的建井的代價如果可以從i連水管到v,建一條i到v的單項邊,邊權為修水管的代價然後就是用朱劉演算法求最小樹形圖了。朱劉演算法詳見:http://blog.csdn.net/wsniyufang/article/details/6747406*/#include <cstdio>#include <iostream>#include<queue>
Time of Update: 2018-12-05
/*題目要求:給出兩個整數n和p,代表n個珠子,n種顏色,要求不同的項鏈數,並對結果mod(p)處理。置換隻有旋轉一種方式,那麼共有n個置換基本知識:環的個數為gcd(n , i) , 長度L=n / gcd(n , i) 其中 i 為轉的位子數普通求法: ∑n^( gcd(n,i) ) 0<=i<n 複雜度過高最佳化:枚舉環的長度L枚舉最佳化: L可以從1取到sqrt(n) ,因為L|n , n/L | n對於每個L,我們再看有幾個i滿足條件n/L = gcd(n , i)
Time of Update: 2018-12-05
/*給定一個關係網,A B C表示B必須在A後,間隔為C,允許多線程同時操作最後求最短的時間把所有任務完成解法:關鍵路徑topsort維護每個節點最早可以完成的時間*/#include<cstdio>#include<iostream>#include<vector>#include<queue>#include<cstring>using namespace std;struct node{ int y,t;}edge[1000
Time of Update: 2018-12-05
/*最小樹形圖圖模版-朱劉演算法模版說明:點標號必須0-(N-1) 必須去除到自身的點(到自身的邊的邊權賦無限大)*/#define M 109#define type intconst type inf=(1)<<30;struct Node{int u , v;type cost;}E[M*M+5];int pre[M],ID[M],vis[M];type In[M];int n,m; type Directed_MST(int root,int NV,int NE)
Time of Update: 2018-12-05
個人覺得這個部落格把這個演算法說的比較詳細了,直接搬過來吧,我再闡述一遍的話沒有人家說的好,還容易說錯。========================== 分割線之下摘自Sasuke_SCUT的blog==================================================最 小樹形圖,就是給有向帶權圖中指定一個特殊的點root,求一棵以root為根的有向產生樹T,並且T中所有邊的總權值最小。最小樹形圖的第一個演算法是 1965年朱永津和劉振宏提出的複雜度為O(VE
Time of Update: 2018-12-05
描述:這是物理上的一個槓桿問題,就是重物與力矩相乘,看一下兩邊是否相等,才開始我沒有採用建樹方法,後來又用建樹的方法做了一下,不過很慚愧,建樹時出現了問題,結果好幾次wa……代碼一:不建樹代碼#include <iostream>#include <cstring>#include <cstdio>using namespace std;int flag;int creat_recursion(int w1,int d1,int w2,int d2){
Time of Update: 2018-12-05
描述:和前面的幾道水題一樣,還是兩種代碼,使用庫函數的話耗時比較少一點,用劉汝佳的產生可重集排列的方法耗時多,沒什麼難度代碼一:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int main(){ //freopen("a.txt","r",stdin); char s[20]; int
Time of Update: 2018-12-05
描述:問題就是劉汝佳書上的的區間選擇問題,如果不會的話就看看書吧#include <cstdio>#include <cstdlib>#include <cstring>int n,m;int cmp(const void *p1,const void *p2){ int a=((int *)p1)[0],b=((int *)p1)[1],c=((int *)p2)[0],d=((int *)p2)[1]; if(a<0) a=0;
Time of Update: 2018-12-05
描述:題意很簡單,先快排一下,然後從中選擇即可,因為我覺得只用數組有些麻煩,所以用了結構體#include <cstdio>#include <cstdlib>struct Ele{ int We; int Iq; int sum; int next; int pos;};Ele count[1010];int cmp(const void *p1 ,const void *p2){ int p1_We=((Ele *)p1)->
Time of Update: 2018-12-05
/*題意:1-n在一棵樹上,給定邊的關係。要求得到每一個頂點的後繼節點中比它值小的個數題解:樹狀數組。dfs過程中,進入一個節點x前求一次sum(x-1),然後add操作,遞迴返回節點x後再求一次sum(x-1) 兩次sum操作的差值就是比x小的個數本題資料量大,遞迴太深可能爆棧,一般用while+人工棧類比遞迴的過程,當然c++可以設定棧的大小,這樣就不會爆棧了 */#include <cstdio>#include <iostream>#include &
Time of Update: 2018-12-05
描述:題目難度為 2,將一條長為n的木棍切成m+1塊,但是切割順序不同,尋找狀態方程s[x][y]=min(s[x][y],s[x][i]+s[i][y]+s[y]-s[x]);然後就可以敲代碼了代碼一(遞迴,耗時較多):#include <cstdio>#include <cstring>int num[55],s[55][55];int min(int a,int b){ if(a>b) return b; else return a;}int
Time of Update: 2018-12-05
/*本題為不是固定根的最小樹形圖,我們可以虛擬出一根來,然後在把這個根跟每個點相連,相連的點可以設為無窮大,或者設為所有邊和大一點,比如為r,然後就可以利用最小樹形圖進行計算了,計算出的結果減去r,如果比r還大就可以認為通過這個虛擬節點我們連過原圖中兩個點,即原圖是不連通的,我們就可以認為不存在最小樹形圖。關於輸出最小根也挺簡單,在找最小入弧時,如果這條弧的起點是虛擬根,那麼這條弧的終點就是要求的根。*/#include <cstdio>#include
Time of Update: 2018-12-05
/*題目地址:http://w.boj.me/onlinejudge/newoj/showProblem/show_problem.php?problem_id=197題意:給你一個人際關係網(雙向的),讓你求關鍵的關係,既如果這條關係斷了,就會有某兩個或以上的人失去聯絡了求這樣的關係解法:tarjan演算法 求割邊dfn[v]記錄到達點v 的時間,low[v]表示通過它的子結點可以到達的所有點中時間最小值,即low[i]=min(low[i],low[u]),u 為v 的了孫,初始化時low[
Time of Update: 2018-12-05
Part
Time of Update: 2018-12-05
描述:這道題內容是通過構造一個二叉樹,看一下那些葉子在樹上時垂直位置是重合的,重合的就加在一塊求和,然後水平輸出就可以了,關鍵是在dfs中的優先遍曆統計葉子在垂直位置的數目和,然後就可以AC了#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct Tnode{ int c; Tnode *left,*right; Tnode ()
Time of Update: 2018-12-05
描述:把一個字串通過增加操作變成迴文,然後把這個迴文輸出#include <cstdio>#include <cstdlib>#include <cstring>char str[1010];int p[1010][1010];int v[1010][1010];int min(int x,int y){ return x>y?y:x;}int dp(int x,int y){ if(v[x][y]!=-1) return v[x][y];
Time of Update: 2018-12-05
描述:先加後乘還是先乘後加問題,注意要用long long int#include <cstdio>#include <cstdlib>#include <cstring>char s[1010];int main(){ // freopen("a.txt","r",stdin); int n; scanf("%d\n",&n); while(n--) { gets(s); long long
Time of Update: 2018-12-05
描述:這道題很簡單,就是找當前排列的下一個產生可重集排列,用庫函數可以,我根據自己發現的一個規律也寫了另一種代碼,耗時一樣,不過要用劉汝佳書上寫的那種方法做居然逾時了,搞不懂,可能是50個字元太多,2^50次方會逾時吧代碼一:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int main(){