學習心得(2)

2021-10-10 02:59:23 字數 3760 閱讀 4300

第二次學習心得。10.24

首先說一下

我在上周末自學了高精度演算法,總的來說,其實是利用了陣列和字串來擴大了數字長度;(不過不明白python為什麼不會有爆int這種事);並且模擬了豎式計算把大數運算化為若干個小數運算;(**有點長,不給出了罷)

今天自學了點string類的知識;string是乙個類(今天才發現);其中包含各種建構函式,有初步認識,日後深究再做表示;

下面說下某些題解吧;

#1 洛谷

p1047

這其實是和區間長度有關的問題;其實就是問你在一段給定的區間長度的數軸上挖掉幾段,算一下一共剩下多少沒挖`;當時我不會處理區間,就用了最暴力的方法。

1.把有樹的點記為1;2.把砍掉樹的點記為0;3.算下有幾個1;

#include

#include

using

namespace std;

int a[

10010];

intmain()

for(

int e=

0;eint s=0;

for(

int i=

0;i1;i++

) cout<

return0;

}

和cy學長交流過後(感謝cy學長),我知道了利用區間的做法;後面有類似題會表示那種方法;

p5729

這題就是三維化的砍樹題吧;

類似上題解法

#include

#include

#include

using

namespace std;

int a[21]

[21][

21];int

main()

}}int k,l,t,o,p,q;

while

(n--)}

}}int sum=0;

for(

int i=

1;i<=x;i++)}

} cout<

return0;

}

p2141

雖然題目裡說什麼珠心算,但本題和珠心算毫無瓜葛;

乙個數,只要保證是其他2個元素的和就行;

要注意的是不能重複計數;

#include

#include

using

namespace std;

int a[

100000

],flag[

1000000];

intmain()

for(

int i=

1;i<

2*n-

1;i++

)for

(int j=

0;j1-i;j++)}

long

long x,y,p,q=b[0]

;p=a[0]

;long

long u=

0,o=0;

for(

int i=

1;i)else}if

(uu=q-p;

cout<

' '<

return0;

}

p5731

這題有兩種寫法;一種是給二維陣列a賦值的時候就將蛇形方陣排號了;

另外一種是a賦值為1~n*n;然後按蛇形方陣輸出;

但第二種容易出錯;建議第一種方法;下面是第一種的題解**;

#include

#include

using

namespace std;

intmain()

for(

int i=k;i<=l-

1;i++

)for

(int i=l;i>=k+

1;i--

)for

(int i=l;i>=k+

1;i--

) l=l-

1;k=k+1;

}if(n%2==1

)for

(int i=

1;i<=n;i++

) cout<

}return0;

}

每乙個for迴圈把相同顏色的格仔填滿;乙個while將有顏色的一圈填滿;

然後k加1,l減1,開始內層的正方形賦值;

注意,n為奇數的時候最中間的格仔不會被賦值;

因此必須加判斷句(1);

usaco 1.1.2

這題就是更難的區間問題了;根據cy學長的方法,我試著寫了一條;

大致是把各區間按左座標的大小從小到大排好;乙個記錄最左端;乙個記錄連續區間最右端;每次判斷下區間能否合併;若不能;則進行一次結算;

#include

using

namespace std;

int a[

5010

],b[

5010];

intmain()

for(

int i=

0;i1;i++

)for

(int j=

0;j1-i;j++)}

int x,y,p,q=b[0]

;p=a[0]

;int u=

0,o=0;

for(

int i=

1;i)else}if

(uu=q-p;

cout<

' '<

return0;

}

這個**看上去沒毛病;但只過了5個點;cy學長開始覺得沒問題;但之後和我說大概細節炸了;但我至今也沒發現錯誤之處;

我開始嘗試新的辦法;就是把所有座標放在乙個陣列裡並從小到大排序;左端點記為1;右端點記為-1;當端點標記的和為0的時候;表示乙個合併區間已經完成;並開始結算;

#include

#include

using

namespace std;

long

long a[

100000

],b[

100000

],c[

1000000

],f[

100000];

intmax

(int

,int);

intmain()

int k=0;

for(

int i=

0;i<

2*n;i+=2

) k=0;

for(

int i=

1;i<

2*n;i+=2

)for

(int i=

0;i<

2*n-

1;i++

)for

(int j=

0;j<

2*n-

1-i;j++)}

int sum=

0;k=0;

int m=

0,mi=0;

for(

int i=

0;i<

2*n;i++

)else sum--;if

(sum==0)

} cout<

' '<

return0;

}

就先說到這裡;有點少,前幾天比較忙;

學習心得2

我一直以為switch.case語句中的case和break之間只能寫一句話,因為以前書上舉得例子一直都是那樣的,所以。呵呵,如今我知道case和break之間可以寫很多句,只要你不嫌亂。而每乙個case和break就相當於是一對大括號,這樣想寫多少隨你了。但是寫的語句太多,會覺得很亂,可讀性比較差...

ACM學習心得 2

前幾天部落格忘記寫了 一次性補上 我是一天學一篇部落格 雙指標 比較基礎的乙個演算法 主要是用來找回文字串的 891.有效回文 ii 給乙個非空字串 s,你最多可以刪除乙個字元。判斷是否可以把它變成回文串。這個題目總結了雙指標的用法 先用ij兩個下標來尋找回文 如果尋找到不相同的 可以刪除i或者j判...

c 學習心得 2

函式或者說方法都是寫在類下的,我們可以通過函式名來呼叫它們。首先,我們要弄清楚為什麼會有函式或者說方法這種東西?這裡,我們使用了與前一篇同樣的思維方式,先從它的目的或者實用價值出發。當我們在編寫程式的時候,有時會遇到這樣的情況。比如說,求某個數的階乘。我們會寫出一連串的語句,以得到我們的結果。可是,...