2019 7 30考試記錄

2021-09-25 17:11:40 字數 3447 閱讀 6844

機房模考: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和...