2016程設期末偽題解

2021-07-14 16:20:42 字數 3582 閱讀 3023

期末發揮實在是太差了-_-#

比2023年少了好多送分題,整體難度顯得很大,但是考完之後靜下來做又覺得並不是很難orz

1. 籃球聯賽:暴力列舉(我用的 dfs 來列舉)

2. 奪寶探險:暴力 dfs

3. 尋找邊緣:從邊緣暴力 dfs

4. 猴子摘桃:可以直接用兩個指標指向區間端點做到 o(n)

5. 分形盒:直接遞迴

6. 42點:暴力 dfs 遍歷所有結果

以上幾題就不放**了

7. 上機:dp

題意:有 n 個座位排成一排(1<=n<=10000),給定坐到每個座位上兩邊有0個、1個和2個人時可獲得的價值(左端左邊和右端右邊視為沒有人),求 n 個同學全部上座後可獲得的最大價值。

題解:考慮動態規劃的一般套路,當新加進來乙個位置 i 的時候,用 dp[i][0] 表示位置 i 右邊沒人時的最大值,dp[i][1] 表示右邊有人時的最大值,考慮座位 i 上的人和座位 i-1 上的人誰先坐下,那麼就有dp方程:

dp[i][0] = max(dp[i-1][0] + v[i][1], dp[i-1][1] + v[i][0]);

dp[i][1] = max(dp[i-1][0] + v[i][2], dp[i-1][1] + v[i][1]);

其中 v[i][j] 是坐在位置 i 上兩邊有 j 個人時的價值,時間複雜度為 o(n)。

#include 

#define max(a,b) ((a)>(b)?(a):(b))

int main()

printf("%d", dp[n][0]);

return

0;}

8. 迷宮入口:較難的 dfs

題意:給定大正方形的邊長和若干個小正方形的邊長,問能否用這些小正方形恰好不重疊地拼成大正方形。

題解:直接考慮搜尋,將小正方形從下往上從左往右擺,所以每次挑最低且最左端的位置放,放的時候優先考慮較大的(因為小的更靈活),關鍵在於如何記錄放上去後的狀態變化,直接利用二維陣列標記會超時,考慮將大正方形分成列,用 col[i] 表示第 i 列有多少個格仔被小正方形蓋住,標記的複雜度直接降了一維。

#include 

#include

using

namespace

std;

int ok, num[20], col[50];

void dfs(int lev, int n, int s)

int nowcol, tmp = 50;

for (int i = 0; i < s; ++i)

if (col[i] < tmp)

// 找到最低的且最左端的位置

for (int nows = 10; nows > 0; --nows) // 從大到小列舉當前位置放的正方形邊長

if (num[nows] && nowcol + nows - 1

< s && col[nowcol] + nows <= s)

}}int main()

ok = 0;

if (area == s * s) dfs(0, n, s);

cout

<< (ok ? "yes" : "no") << endl;

}return

0;}

9. 變換的迷宮:bfs 變形

題意:王子救公主,當時間恰能被 k 整除時牆會消失(2<=k<=10),求最短救出時間。

題解:bfs 的時候將時間模 k 的餘數作為訪問陣列的第三維即可。

#include 

#include

using

namespace

std;

int dx = , dy = ;

struct node

};int main()

; // 第三維是時間模k的餘數

for (int i = 0; i < r; ++i)

for (int j = 0; j < c; ++j)

}queue

q; q.push(node(sr, sc, 0));

vis[sr][sc][0] = 1;

while (!q.empty())}}

if (!q.empty()) cout

<< q.front().time << endl;

else

cout

<< "oop!"

<< endl;

}return

0;}

10. 遊覽規劃:列舉+二維混合揹包

題意:已知遊樂場的門票費用和每個遊樂專案所花費的時間、現金、次數限制(一次/無限次)以及可獲得的歡樂值,求給定現金下可獲得的最大歡樂值。

題解:列舉遊玩天數,除掉門票錢之後對專案進行二維費用的混合揹包(01/完全)。

#include 

#include

#include

#define max(a,b) ((a)>(b)?(a):(b))

using

namespace

std;

int dp[1005][2405] = ;

void zeroonepack(int c, int t, int v, int tott, int totc)

void completepack(int c, int t, int v, int tott, int totc)

int main()

for (int day = 1; day <= totdays; ++day) // 列舉天數

cout

<< ans << endl;

}

11. 張三丰的傳人:搜尋

題意:給定正整數s(1<=s<65536),求方程組 ∑n

i=1a

i=s

∑ni=

11ai

=1的一組正整數解(n 未知)。

題解:按遞增順序對解進行 dfs,連剪枝都不需要就直接過了-_-#

#include 

#include

#include

using

namespace

std;

int cnt, ok, ans[200];

// leftd為剩下整數的倒數和,lefts為剩下的整數和,last為上乙個整數

void dfs(double leftd, int last, int lefts)

for (; last <= lefts; ++last) // 列舉當前整數

}int main()

}return

0;}

程設十三周

問題描述 這一天,tt 遇到了乙個神秘人。神秘人給了兩個數字,分別表示 n 和 k,並要求 tt 給出 k 個奇偶性相同的正整數,使得其和等於 n。例如 n 10,k 3,答案可以為 4 2 4 tt 覺得這個任務太簡單了,不願意做,你能幫他完成嗎?本題是spj input 第一行乙個整數 t,表示...

程設 神奇的MyAny

總時間限制 1000ms 記憶體限制 65536kb 描述編寫 myany類以及,myany cast模版 可能多個 使得程式按要求輸出 要求myany類必須要有析構函式,在析構函式以及其他適當的地方 比如複製建構函式,過載的賦值號 要釋放動態分配的空間,不能造成記憶體碎片。include incl...

2016計概A期末 照亮房間

你需要放置一盞燈來照亮房間的每個角落,問這是否能辦到?輸入包含多組資料。每組資料第一行是正整數n 4 n 100 表示房間輪廓所形成的多邊形的頂點個數。接下來n行,每行表示房間的乙個頂點。頂點按順時針的順序給出,房間輪廓多邊形的所有邊都平行於座標軸。輸入以n 0表示結束。對每組資料輸出一行。如果能有...