APCS
以下數字範圍只列所有子題中最大的
題目敘述有修改過
給一個有
給
就掃一遍一邊改就好,超級簡單。
時間複雜度
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> a(n);
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 3; i < n; i++){
if(abs(a[i] - a[i - 1]) <= 5) continue;
int t[3] = {a[i - 3], a[i - 2], a[i - 1]};
sort(t, t + 3);
a[i] = t[1];
}
for(int i = 0; i < n; i++){
if(i != 0) cout << " ";
cout << a[i];
}
cout << "\n";
return 0;
}
給一個有
給一個大小為
就是把每種操作反推回來:
這樣一來,只要從最後一個操作開始反推就能得到最初的數列。
時間複雜度
(注意程式碼中我用的陣列 index 是從 0 開始)
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
vector<int> x(n);
for(int i = 0; i < n; i++) cin >> x[i];
vector<int> a(m);
for(int i = 0; i < m; i++) cin >> a[i];
for(int i = m - 1; i >= 0; i--){
vector<int> t(n);
if(a[i] == 1){
int now = 0;
for(int j = 0; j < n; j += 2) t[now++] = x[j];
for(int j = 1; j < n; j += 2) t[now++] = x[j];
}
else if(a[i] == 2){
int now = 0;
for(int j = 0; j < n / 2; j++){
t[now++] = x[j];
t[now++] = x[n / 2 + j];
}
}
else{
int now = 0;
for(int j = n - a[i]; j < n; j++) t[now++] = x[j];
for(int j = 0; j < n - a[i]; j++) t[now++] = x[j];
}
x = t;
}
for(int i = 0; i < n; i++){
if(i != 0) cout << " ";
cout << x[i];
}
cout << "\n";
return 0;
}
有一個有
不能走出表格外面。在完成一次操作後,若移動到的格子為
給
起點和目標位置必為停留點
把這個表格想成一張有向不帶權圖,每個節點表示一個格子,編號同格子編號。由節點
時間複雜度
#include <bits/stdc++.h>
#define pii pair<int, int>
#define mp make_pair
#define F first
#define S second
using namespace std;
int main(){
int n, p, l, r;
cin >> n >> p >> l >> r;
vector<int> s(n);
for(int i = 0; i < n; i++) cin >> s[i];
vector<bool> visit(n);
queue<pii> q;
q.push(mp(0, 0));
visit[0] = true;
while(!q.empty()){
int v = q.front().F, step = q.front().S;
q.pop();
if(v == p){
cout << step << "\n";
return 0;
}
if(v - l >= 0 && s[v - l] >= 0 && s[v - l] < n && !visit[s[v - l]]){
q.push(mp(s[v - l], step + 1));
visit[s[v - l]] = true;
}
if(v + r >= 0 && s[v + r] >= 0 && s[v + r] < n && !visit[s[v + r]]){
q.push(mp(s[v + r], step + 1));
visit[s[v + r]] = true;
}
}
cout << "-1\n";
return 0;
}
給一個
給
這是 DP,先設第
初始狀態:
轉移:
時間複雜度
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> rs, cs;
int row(int r, int y1, int y2){
return min(rs[r][y2] - rs[r][y1 - 1], y2 - y1 + 1 - (rs[r][y2] - rs[r][y1 - 1]));
}
int column(int c, int x1, int x2){
return min(cs[c][x2] - cs[c][x1 - 1], x2 - x1 + 1 - (cs[c][x2] - cs[c][x1 - 1]));
}
int main(){
int m, n;
cin >> m >> n;
vector<vector<int>> a(m + 1, vector<int>(n + 1));
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
cin >> a[i][j];
}
}
rs.resize(m + 1, vector<int>(n + 1));
cs.resize(n + 1, vector<int>(m + 1));
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
rs[i][j] = a[i][j] + rs[i][j - 1];
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cs[i][j] = a[j][i] + cs[i][j - 1];
}
}
vector<vector<vector<vector<int>>>> dp(m + 1, vector<vector<vector<int>>>(n + 1, vector<vector<int>>(m + 1, vector<int>(n + 1))));
for(int rl = 1; rl < m; rl++){ //含有 rl+1 列
for(int cl = 1; cl < n; cl++){ //含有 cl+1 行
for(int i = 1; i + rl <= m; i++){
for(int j = 1; j + cl <= n; j++){
dp[i][j][i + rl][j + cl] = min({
dp[i + 1][j][i + rl][j + cl] + row(i, j, j + cl),
dp[i][j + 1][i + rl][j + cl] + column(j, i, i + rl),
dp[i][j][i + rl - 1][j + cl] + row(i + rl, j, j + cl),
dp[i][j][i + rl][j + cl - 1] + column(j + cl, i, i + rl)
});
}
}
}
}
cout << dp[1][1][m][n] << "\n";
return 0;
}
競賽連結請先登入 Codeforces 帳號再點擊。 附中校內賽 時間:2022-10-08(六) 14:00-17:00 OI 制,6 題 不可使用電子、紙本參考資料(cppreference 除外) 無計分板 競賽連結:Codeforces 題本
Oct 10, 2022粉絲專頁:師大附中/延平中學 競技程式讀書會 活動簡介 最近幾年,資訊相關科系成為了熱門科系,也越來越多人參加 APCS 和各種資訊競賽。在高中,最主流的資訊競賽是演算法競賽,或者叫競技程式。 資訊作為一個非主科的科目,相對於數學、地科等等科目,資源少了很多,也比較難以入門。因此,附中和延平的一些有經驗的競賽選手自發舉辦了這個讀書會,旨在提供長期、完整的競賽課程,讓每個人都有機會接受良好的競賽指導,並且促進選手之間的交流,提升兩校的競賽風氣。 活動內容 讀書會的活動以上課為主,預計從 110 學年度上學期開學後開始上課,時間暫定為每週四 18:30 至 21:30,段考前一週停課。上學期會教基本的競賽知識,下學期則是較進階的技巧,且上下學期的期中、期末會各有一次模擬競賽。
Jun 30, 2022時間:2021-10-03 14:00-17:00 三個小時,OI 制,賽中沒計分板 競賽連結:110 學年度 師大附中資訊學科能力競賽 上機 Mirror (請先登入 Codeforces 再點連結) 題解:https://hackmd.io/@joylintp/r1ad59CQK
Oct 3, 2021因為不小心出太難了,場內沒幾個人寫得出來,所以丟出來給大家打 (?)。 共兩場,一場三個小時,OI 制,語言限 C/C++。 時間 模擬競賽 I:2021/09/20(一) 14:00-17:00 模擬競賽 II:2021/09/21(二) 14:00-17:00 比賽連結 在 Codeforces 上比,請先登入 Codeforces 再點擊以下連結。
Sep 21, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up