A題
for迴圈判斷從第2個字元開始是否全部是大寫字母即可,注意如果字串只有1個字元的情況;
B題
-10到10,只需要每個數都加上10,那麼開一個20大小的數組,記錄每個數的出現次數 f [ ],然後 sum= sigma ( f [ i ] * f [ 20-i ] ) | i<10 ,
另外 f [ 10 ] 表示0的個數,即C( f[10], 2 );
C題
注意不能多算,我是枚舉男孩的數目 , i=4開始枚舉,那麼女孩數目就是 t-i,然後用預先處理的組合數直接帶入計算;注意很多邊界情況,比如枚舉的i要 i<=n, t-i>=1 && t-i<=m; 這些我都在預先處理組合數的時候處理出來了; 開始我錯了一次,是由於組合數的預先處理沒有處理好;
D題
我用了圖論裡面的 雙連通分量 來縮點;
縮點後開始我一直錯誤,原來是沒有考慮全部的圖形,屬於環的每個點都可能引出非本身分量的邊,點;
我覺得一個合理方便的寫法是:
for(i=1;i<=n;++I){
if( node i belong the cycle ){
dis [ i ] = 0;
dfs( i );
}
}
dfs()中,注意如果鄰接點是屬於cycle的,則不可訪問;
E題
我的做法我覺得還是很巧的,先給出一個表;
(1,1) (1,2) (1,3) (1,4) (1,5) (1,6)
(2,1) (2,2) (2,3) (2,4) (2,5) (2,6)
(3,1) (3,2) (3,3) (3,4) (3,5) (3,6)
...
一個結構體儲存點座標及輸入標號; 對該結構體排序,以x為第一關鍵字,以y為第二關鍵字;這樣我就可以掃描,得到水平方向的情況;
再以y為第一關鍵字,以x為第二關鍵字,掃描可以得到豎直方向的情況;
斜向右上方方向,觀察座標數值,我以 (x+y)為第一關鍵字,以x為第二關鍵字,這樣可以得到該方向的情況;
斜向右下方,我當時的做法是 進行 座標變換 方便以 (x+y)為第一關鍵字, y為第二關鍵字,這樣可以得到該方向的情況;
(6,1) (6,2) (6,3) (6,4) (6,5) (6,6)
(5,1) (5,2) (5,3) (5,4) (5,5) (5,6)
(4,1) (4,2) (4,3) (4,4) (4,5) (4,6)
....
後來學弟發現不需要變換,直接按 x-y作為第一關鍵字即可,確實啊;
自己突然領悟到不管你如何按你的方式改變座標,只要維持點本身的相對位置不變就可以;
後來我看解題報告的時候發現居然有O(m)的做法,確實很神!
Problem E can be done in O(n+m) -- i.e. O(m) when m is at least on the order of n.
For the horizontal case, we determine the leftmost and rightmost queen on each row in O(n+m). The vertical and diagonal cases are similar. Then, we can compute the number of attacked queens for each queen in O(m) by simply checking whether it is the leftmost,
rightmost, etc. in it's row/column/diagonals.
F題
這題我想了很久很久,最後還是看題解的。
我沒想到 會是 枚舉兩兩行O(n*n),然後是統計確定的兩行之間的情況數,而且預先處理 + 統計方式我覺得很神奇,自己缺乏這點思維,這題思路值得借鑒!
加油!!!
明天是3月12日