2023年CSP J複賽題解

2022-05-24 08:24:12 字數 2756 閱讀 7643

題目涉及演算法:

題目大意:求乙個長度為8的字串中有多少個字元0。

題解:首先開乙個變數用於計數(我稱此變數為「計數器」,初始時計數器的值為0)。

然後輸入字串,然後從0到7遍歷字串的前8個字元,每當遇到乙個字元『1』就將計數器加一,最後輸出計數器對應的值即可。

實現**如下:

#include using namespace std;

char s[10];

int cnt;

int main()

題目大意:

有公交和地鐵,做地鐵會得到一張票,憑此票可以在45分鐘內免費坐一班票價小於等於地鐵票的公交車,

預設按照最早的一張符合要求的地鐵車票開始使用。問按照這種操作,小軒出行的總花費。

題解:因為條件是限定死的,即給了我乘車的記錄,答案是固定的。所以不管我使用什麼方法,只要能解決這樣乙個過程就可以了。

本題如果將條件中的時間間隔從 45 分鐘修改為 n 分鐘,那麼是可以使用線段樹+二分做的。

然而題目給我們的時間間隔是固定的 45 分鐘,所以我們可以採取更暴力的手段來解決這個問題。

我們只需要從前往後遍歷每一張車票,

因為題目限定了時間從早到晚,並且每班車的開始時間都不一樣,所以對於第 i 班車,我們只需要從第 max(1, i-45) 班車開始遍歷到第 i-1 班車就可以了。

所以總的時間複雜度是 o(45n) 。

實現**如下:

#include using namespace std;

const int maxn = 100010;

int n, // 乘車記錄的數量

type[maxn], // 交通工具型別

price[maxn], // 乘車的票價

t[maxn], // 開始乘車時間

tot; // 總花費

int main()

}if (!flag) tot += price[i];}}

cout << tot << endl;

return 0;

}

題目大意:

有 n 件物品,它們每一天都有乙個**,然後現在有t天,每一天你都可以選擇賣出你手頭上有的任意物品任意件,也可以選擇以當天的****任意物品任意件。

題解:完全揹包變形題。

我們列舉任意兩天 i 和 j(i小於j),那麼在已知第i天我能夠獲得的總價值是 vi 的情況下,我們可以進行一次完全揹包:

揹包的容量為 vi,同時我們令 fi 表示容量為i的揹包的最大價值,那麼第i天能夠擴充第j天揹包的最大容量應該是 max(fk + vi-k) ,然後我們再選該候選項和當前 vj 的最大值作為 vj 的選項即可。

實現**如下:

#include using namespace std;

const int maxn = 10010;

int n, t, a[101][101], v[101], f[maxn];

void solve(int day1, int day2)

}int tmp = 0;

for (int i = 0; i <= v[day1]; i ++) tmp = max(tmp, f[i] + v[day1]-i);

v[day2] = max(v[day2], tmp);

}int main()

}cout << v[t] << endl;

return 0;

}

題目大意:

凱凱的工廠正在有條不紊地生產一種神奇的零件,神奇的零件的生產過程自然也很神奇。工廠裡有 n 位工人,工人們從 1∼n 編號。某些工人之間存在雙向的零件傳送帶。保證每兩名工人之間最多隻存在一條傳送帶。

如果 x 號工人想生產乙個被加工到第 l(l>1) 階段的零件,則所有與 x 號工人有傳送帶直接相連的工人,都需要生產乙個被加工到第 l−1 階段的零件(但 x 號工人自己無需生產第 l−1 階段的零件)。

如果 x 號工人想生產乙個被加工到第 1 階段的零件,則所有與 x 號工人有傳送帶直接相連的工人,都需要為 x 號工人提供乙個原材料。

軒軒是 1 號工人。現在給出 q 張工單,第 i 張工單表示編號為 a_i的工人想生產乙個第 l_i 階段的零件。軒軒想知道對於每張工單,他是否需要給別人提供原材料。他知道聰明的你一定可以幫他計算出來!

題解:將每個點拆分成奇點和偶點,從1號偶點求到每個點的最短路。

然後對於每次詢問的距離l和點u,如果l是偶數並且到點u偶點的距離小於等於l,或者l是奇數並且到點u奇點的距離小於等於l,那麼就能夠走通。

但是還有一組特例,就是如果點1的度數為0(即沒有連向點1的邊)並且詢問的點也是1,那也沒有辦法走到,因為起點沒有邊,需要特殊判斷這個條件。

實現**如下:

#include using namespace std;

const int maxn = 100100;

int dis[maxn][2], n, m, q;

vectorg[maxn];

struct node

};queueque;

bool inq[maxn][2];

void spfa() }}

}}int main()

spfa();

if (g[1].size() == 0)

else

}return 0;

}

CSP J 2019遊記 題解

遊記區 遊記結束 題解開始 t1 還要解釋嗎 include using namespace std int ans,t intmain printf d ans fclose stdin fclose stdout return0 t2 不優化的 luogu45分 include include ...

豬頭兒子CSP J2019複賽流程

1.找到 d csp js 並進入該資料夾,開啟電子考題 pdf 檔案,瀏覽試題 1 4,並定位與試題 1 4 對應的測試資料資料夾 不一定每道試題都有,如果沒有,可以自己筆算出幾組 in和 ans資料放入自定義測試資料資料夾作為測試 瀏覽裡面的測試資料編號 2.在 d csp js 資料夾下新建 ...

2020CSP J普及組複賽(民間資料)題解

這一道題就是一道簽到題 這道題我們可以很快速的發現,若n為奇數 即n 2 1 則n必定無法拆分 若n為偶數,其實就只需要有以下操作 1.先通過計算2的k次冪,找到第乙個滿足大於等於n的值 2.計算當n k 0時,輸出k,隨後將k k 2 最後當n等於0,則輸出即為其優秀拆分 還可以直接把2的次冪打出...