Time of Update: 2018-12-03
1. 永遠不要停止學習和閱讀閱讀 書籍,而不只是網站閱讀 只為自我提升,而不是為了下一個項目閱讀 提升你的基礎,而不只是最新技術2. 跟比你聰明的人一起工作跟比你更聰明的人或者是更有經驗的人一起工作,可以讓你快速提升3. 變成一個全才不要過於鑽牛角尖,這可能會讓你停滯不前和傷害你的就業前景。4. 閱讀並記錄別人的代碼其實寫代碼比閱讀並理解別人的代碼要容易的多。5. 在實際的項目中擷取編程經驗只有在真實的項目中,各種壓力下、真實善變的客戶、不斷變化的需求下,才能不斷提升你的技能。6.
Time of Update: 2018-12-03
題目串連網上很多人都說這題很經典,值得做一做,可對於剛學線段樹的Acmer似乎有難度,我也不列外,搜了很多人的結題報告,也沒幾個人說清楚,完全不會!只好拿著別人代碼來敲,一步一步理解。畫了一張圖。也讓我知道什麼是離散化,什麼是掃描線。這也就說明了每次掃描相鄰的兩條邊,並計算出y,那麼就需要更新邊。這樣就把矩形分割了。#include<cstdio>#include<iostream>#include<algorithm>using namespace std;
Time of Update: 2018-12-03
題目串連這也算是線段樹入門第一道自己完成的題目。因為在以前,看過別人寫的線段樹區間更新的方法,叫做延遲標記法,意思是:每次更新不需要更新到底部,換句話說:並不需要每個元素一一更新,只有等到下次更新或被詢問的時候才更新!.操作的方法就是用一個輔助數組來記錄(標記)更新的資訊。我們知道線段樹又叫區間樹,它又是平衡二叉樹。線段樹的操作是用遞迴實現的。尋找是二分搜尋故時間複雜度為(logn)。它可以一個數組來表示,看下面這張圖:在用數組存的時候很注意數組的大小。認清楚數組位置中所對應的線段樹的位置是協助
Time of Update: 2018-12-03
水題一個:先列印素數表,然後去中,往兩邊一次選,就可以了,主意可以認為相同的兩個素之和等於偶數,比如34=17+17。先前沒注意這個WA。#include<stdio.h>#include<math.h>int p[10010]; void get() //列印素數 { p[1]=1; for (int i = 4; i <= 10010; i += 2) { p[i] = 1; } int LIM =
Time of Update: 2018-12-03
這題的的公式很好推。先在m個數裡進行全排列。由於有相同的,那麼就要除去每個相同個數的階乘。故有公式:A=(a+b+c+d+........)!/(a! *b! *c! *d!.........)另外這是個大數,需要用到高精度了。#include<stdio.h>int num[250],a[30];int n,len;void solve(int m){int carry,tmp,i,j,k;len=1,num[0]=1;for(i=2;i<=m;i++){
Time of Update: 2018-12-03
看似簡單的題,卻深藏殺機!這題一看就是遞推題,我以向很喜歡這類型的題,這題非常容易著手。由於這類型題很容易找規律。比如這題。先看正立的三角形。畫一圖就可以得出f(n)=f(n-1)+2n-1+n*(n-1)/2;先前以為就可以水過了。答案卻WA!。重新畫一個圖,終於發現原來還有倒立的三角形。從第4個就出現了一個,第五個出現3個(前一個,後兩個),第六個出現了7個(多了一個倒立的)依次下去。會發現,偶數比奇數先多一個。代碼寫起來非常棘手啊。不知牛人這麼推出來的。一個公式就A了,不解啊!。#incl
Time of Update: 2018-12-03
題意:就是把數的每個位元相加,看是否小於10,是就輸出,否則繼續。分析:本題不難,讓我們做了是為了讓我們知道一個結論。一個數(n)的樹根k=(n-1)%9-1;知道這個這題就是水題了。不知道也沒什麼關係,也可以水過。(輸入的數可能很大)知道就這個代碼:#include<stdio.h>#include<string.h>int main(){ char st[1005]; int r,len;
Time of Update: 2018-12-03
一道典型的字典樹問題。字典樹有叫首碼數,這題不用它才怪。字典樹很簡單,三個基本的操作,建立字典樹,插入,查詢。知道怎麼建和用,就可以A了。#include<cstdio>#include<cstring>using namespace std;struct tire{int num;tire *next[26];tire(){num=0;memset(next,0,sizeof(next));}};tire *root=new tire;void insert(char
Time of Update: 2018-12-03
這類題目做多了,簡直就是水題。很直接的一個prim演算法。不必多解釋。#include<stdio.h>#include<string.h>const int Max=0xffffff;int main(){int i,j,n,k;int a[100][100],w[100]; while(~scanf("%d",&n)) { memset(a,0x3fff,sizeof(a));memset(w,0x3fff,sizeof(w));for(i=0
Time of Update: 2018-12-03
做了LIS問題,嘗試去A一些水題。正好這是一點典型的LIS問題。本題沒什麼限制,O(n^2)的演算法完全可以過。代碼:#include<stdio.h>int main(){int i,j,n;int dp[1005],a[1005];while(scanf("%d",&n)!=EOF){ int max=1; for(i=0;i<n;i++) scanf("%d",&a[i]); dp[0]=1; for(i=1;i<n;i++) { dp[
Time of Update: 2018-12-03
題目串連分析: 該方程左邊的明顯就是在[0,100]區間單調遞增的,這就適應了二分尋找了。直接水過之。#include<stdio.h>#include<math.h>#define eps 1e-10 int sign(double x){return x<-eps?-1: x>eps;}double count(double x){return 8*pow(x,4)+7*pow(x,3)+2*pow(x,2)+3*x+6;}double bsearch(
Time of Update: 2018-12-03
題目串連題意:就是一個最長公用子序列。並列印其路徑。分析:最長公用子序列還不難,注意是列印它的一條路徑。我們知道是用二維數組dp來儲存它的匹配數。一旦有匹配的它就修改後面的值,保證了如何一個狀態當前的dp資料中是最大的值。看一張經典的圖:顯示了路徑的回溯。協助我們能找到匹配的的過程。為了記錄它轉移的方向。我們需要用輔助數組map來記錄它是有那個狀態轉移而來的。可以用遞迴來實現。代碼如下:#include<cstdio>#include<cstring>//using
Time of Update: 2018-12-03
題目串連題意:列印全部LCS路徑,並按照字典順序輸出。本題比較難。參考神人代碼稍做改進如下:#include <stdio.h>#include <string.h>#include <math.h>#include <string>#include <set>using namespace std;const int N=100;set<string> SET;char s1[N],s2[N],temp[N];int
Time of Update: 2018-12-03
題目串連題意很清晰,就是算出從一個對角線到另一個對角線有多小走法(只能向上,向右走)。分析:一個矩陣,它有行有列,要到達對角線,必定有通過所有的行和列,那麼存在兩種情況,當行(n)==列(m),即剛好走完列和行,在m+n個裡選m或n個組合得C(m+n,m)或C(m+n,n)。當兩者不相等,就要看那個先到,所有最小的必定先到達。另外資料應用unsigned型,它比int型儲存的數要大1倍。代碼如下:#include<stdio.h>int main(){ double
Time of Update: 2018-12-03
在Stack Overflow上有這樣的一個貼子《What’s your most controversial programming opinion?》,翻譯成中文就是“你認為最有爭議的編程觀點是什嗎?”,不過,在400多個主回貼,以及上千個所有回貼中,好像並不是很有爭議,而是令人相當的茅塞頓開,下面羅列一些,希望對你有協助。1) The only “best practice” you should be using all the time is “Use Your Brain”.唯一的“
Time of Update: 2018-12-03
題目串連搞了兩天的線段樹,我一直在犯一個錯誤,代碼看似沒錯提交總是RE!,心中的迷惑不解,連續做了幾道題,都這樣,我徹底無語了,搞的我沒心情去涮題了。這題也不列外,提交總是RE,感覺自己數組開的完全沒問題,在網上搜了很久,以為和我寫得差不多的代碼竟可以AC!為何?,我試著把他的代碼改一改,就在我改了全域變數mid後時候。提交終於出問題了。心中迷惑豁然已解!,原來是全域變數mid若的禍!,但我還是不解,為什麼不能這樣!發現在query函數裡有多個嵌套。應該是mid在傳遞過程中,由於定義是全域變數,
Time of Update: 2018-12-03
此題是找規律題,發現規律就不難了。首先,可以肯定字串中只能有一個‘M",而且必定在第一個。先處理 I相當於1,U相當於3.我們發現三個I相當於一個U,而U是由I變來的,把U還原成3個I,I的個數總是2^n個,而三個U相當於一個U,也就意味著在原來的變換中會多出6個I。所以可以推測sum%6==2||sum%6==4,最後剩下2和4,都可以變。考慮MI是原來的字串,所以sum=1也算。代碼:#include<stdio.h>#include<string.h>int
Time of Update: 2018-12-03
分析:看瞭解題報告,先沒看懂,後來恍然大悟。當k>n 顯然是不存在的答案為0;當1<=k=n時,有個很好的技巧,把n拆分n個1,(n=1+1+1.......1),那麼對於整數k,相當於連續取k個1,其它可以任意分開。分兩種情況討論, 取k個連續的點不包含端點。在n個位置區k個連續的點有n-1-k種,在就是把剩餘的n-k-2位置任意分割,相當於n-k-2任意拆分,根據題意提供f(n)=2^n。很快就得到(n-k-1)*2^(n-k-2);如果含有端點,最前和最後,有2種,那麼就有2*
Time of Update: 2018-12-03
這題說是模板題,用stoer演算法可以過,關於這個演算法,網上很多雷同的講解,自己就沒必要再貼一份了(搞不清誰是原著)貼一個模板吧(提交是8000多ms,看牛人將可以達到500多ms,求牛人指點啊)#include<cstdio>#include<iostream>#include<cstring>#define INF 1000000000using namespace std;const int N=505;int graph[N][N];int rec[
Time of Update: 2018-12-03
題目串連題意:將數字n分解,求p(n)得個數。聽說很多人都在看這個:點擊開啟連結我也不多說了:#include<stdio.h>#define mod 1000000007__int64 f[100005];int w[100005];int main(){int p=1,t,n;w[0]=0;for(int i=1;w[p-1]<=100000;i++){w[p++]=i*(3*i-1)/2;w[p++]=i*(3*i+1)/2;}f[0]=1;for(int