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