期末發揮實在是太差了-_-#
比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表示結束。對每組資料輸出一行。如果能有...