機房模考:2019.7.30
今天考了三道題,算是題量較小,所以在考場上時間挺充裕,寫下了一段簡單的記錄。
在引用的基礎上增加一些考試後講題的感悟吧。
"這道題乍一看是個斯特林數,但是慢慢審題,會發現它和斯特林數的區別:座位不能連續放女生(男生預設填充)。
那就有點像兔子生殖的那題,也就是在乙隻兔子生下後不能立刻生下乙隻。手推之後就是個斐波那契數列(但是我也不會證明233)。
打表吧 /笑哭
luogu上面有一道黑題就是斐波那契數列,但是是求10 ^ 5 * 10 ^8(10的5*10的八次方重方)2333333,好像也是推迴圈節吧,那就得在程式裡實現了。
再提一道題,也是斐波那契數列,資料範圍也是10^9,但是mod數無法打表,這道題好像是什麼矩陣加速什麼什麼的,反正我看不懂就對了233"
(寫於考場)
沒錯我寫出的正解就是打表
題目的描述很複雜,但是可以轉化為求斐波那契數列第n位,10^9的資料決定了遞推的o(n)還是慢了。
其實通過上面寫的可見,本人其實以前是接觸過求大位置的斐波那契數列的題目的。但由於學術不精,沒有仔細鑽研,所以寫不出正解:矩陣快速冪和另一種分解公式。
由於後面那個柿子跟斐波那契數列的性質有關,本人不想鑽研而且菜的摳腳所以不做解釋。
我們機房裡面重點講的是矩陣快速冪,我太菜了所以不得不仔細鑽研一下:
由於矩陣乘法滿足結合律,而斐波那契數列可以寫成矩陣乘法的形式。矩陣打不出來就算了23333,參考這裡。
然後後面矩陣的冪可以用快速冪去算,於是就做出了o(log2n)的演算法
還是沒我打表o(1)快2333
打表code:
#include
using
namespace std;
int t,m,n;
int form_long[15]
=;int form[15]
[100]=
,/*1*/
,/*2*/
,/*3*/
,/*4*/
,/*5*/
,/*6*/
,/*7*/
,/*8*/
,/*9*/
,/*10*/};
intmain()
return0;
}
矩陣快速冪code:
#include
using
namespace std;
long
long t,n,mod;
struct zjy
;zjy base,ans;
zjy mul
(zjy x,zjy y)
return res;
}void
quick_power
(long
long x)
return;}
intmain()
return0;
}
"一道樹形dp好題。
乍一看以為是個用某種規則生成一棵圖的生成樹。但是題目描述裡寫到每兩個城市之間只有一道通路,那就是說其實就是一棵樹。
而當某個節點沒有選的時候,不能同時選它的兩個子樹。所以就後序遍歷一手,跑到某個節點給這個節點的答案加上節點值(只有選上所在的節點這個節點才有答案),在回溯的時候將大於0的子樹(子樹之間選不選沒有干擾)加上就ok了。
但是我在寫的時候寫出了乙個神奇的bug233,每一棵樹都有自己的child數,但是本人忘記統計每個節點的degree了,於是就在跑到該節點的時候再記錄一下degree,但是尷尬的是,用乙個變數存degree,在跑到下乙個節點的時候degree會被更新。就會出現…本來挺智障的,但是當時我沒想到啊233。於是我寫了20多行的輸出debug才發現這個沙雕的bug,記錄值得收藏2333
還有就是起點可以隨便選,反正把一棵樹從**提起來都一樣咯。"
(寫於考場)
考場上面寫的夠詳細了2333,就不(懶得)寫了
code:
#include
using
namespace std;
const
int maxn=
200005
;int n,s,a,b,siz[maxn]
,f[maxn]
,ans=0;
struct cityq[maxn]
;intdp(
int u,
int last)
return f[u];}
intmain()
dp(1,
0);for
(int i=
1;i<=n;i++
) ans=
max(ans,f[i]);
printf
("%d"
,ans)
;return0;
}
"這道題應該算是個堆的模板題
但是我們真的會手打堆嗎/笑
直接用stl的大根堆水過這道題233333。
其他的很簡單,從時限大的開始掃,時間逐漸向前推進,同時每過乙個單位時間就處理堆頂的任務。而當某個任務可以選的時候把它放進大根堆就好了。
至於貪心的證明…好像挺好理解,但是嚴謹的證明的話我也給不出。
簡單說明一下:
從後往前掃保證在掃到的時間now時,堆裡面的任務我們都是可以處理的,而且一直到最後,這些任務都不會再過期。
先說不考慮時限的情況,肯定就是直接排序選出最大的那一坨,每個時間處理當前最大的。而考慮時限的話,前面的大任務我們不一定都做得完,而且並不一定在每乙個時間內都有最大的任務去做。
那麼我們就用從後往前掃的方式,相當於去掉了時限這一變數。再用不考慮時限的方法跑一遍,處理在now時最大的任務就ojbk了"
我發現我在考場上面寫的是真的詳細但這不是你不補充的理由。
好吧還是寫一點吧
這種問題的主要問題就是在如何每次選出乙個最小值。很容易想到的就是堆嘛。
其他的還有乙個用並查集或者說是鍊錶寫的寫法,但是是用價值的關鍵字去排序的。演算法複雜度也是o(nlog2n),是一樣的233
code:
#include
using
namespace std;
const
int maxn=
200005
;int n,to_up,j=
0,ans;
struct task
}q[maxn]
,tmp;
priority_queue q;
bool
cmp233
(task x,task y)
intmain()
}printf
("%d"
,ans)
;return0;
}
這次考試屬於不難的那種。自己覺得題目應該都屬於普及的難度,雖然有樹形dp這種天生提高難度的題,但是畢竟只是一道最最最最基礎的所以也就如此吧233333 2019 7 30學習記錄總結
昨天基本資料結構基本上看完了,今天回顧總結一下就開始第三章,第三章在看書開始前就看過幾節這兩天應該會快點 晚上的比賽基本上做的都是水題 昨天晚上的比賽打到心態 一開始ab兩題還好能正常做出來,c題我一開始用自己的方法把負數化為 1整數為1字首加和的同時記錄,後來發現寫太多反而不容易比較了,於是換了一...
2019 7 30訓練總結
今天學的東西不多,學了單調棧和佇列的幾個例題。因為上午吹風扇吹的身體有點不舒服,所以一上午乙個火車進出棧的題沒有看完。通過火車的進出棧這個題我學到了高精度運算和質因數分解。以前稍微了解過質因數分解,但不知道怎麼實現也不知道什麼時候 用質因數分解。現在對質因數分解有了一定的了解。然後又學了莫隊演算法。...
2017 3 18考試記錄
雖然只做出了乙個題,但是第二題跟第三題也有思路,就是單位時間解題效率不高導致沒有做完,所以以後要多做題來加強一下。第一題 題目要求看能否讓所有排隊的人都能正好買到票拿到找零 分析 運用新學的stl中的map容器,將面值與數量存入容器中 注 當收到100要找零75時,應該注意找零順序,有50就給50和...