題目涉及算法:
- 成績:入門題;
- 圖書管理員:模擬;
- 棋盤:最短路/廣搜;
- 跳房子:RMQ/二分答案/DP(本人解法)。
成績
題目鏈接:https://www.luogu.org/problemnew/show/P3954
入門題,直接計算一下即可。
實現代碼如下:
#include <bits/stdc++.h>
using namespace std;
int a, b, c;
int main() {
cin >> a >> b >> c;
cout << (a * 2 + b *3 + c * 5) / 10 << endl;
return 0;
}
圖書管理員
題目鏈接:https://www.luogu.org/problem/P3955
基礎題目,實現代碼如下:
#include <bits/stdc++.h>
using namespace std;
bool check(int a, int b, int n) {
int t = 1;
for (int i = 0; i < n; i ++) t *= 10;
return a % t == b % t;
}
int n, m, book[1001], x, y;
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++) cin >> book[i];
while (m --) {
cin >> x >> y;
int res = -1;
for (int i = 0; i < n; i++) {
if (check(book[i], y , x)) {
if (res == -1) res = book[i];
else res = min(res, book[i]);
}
}
cout << res << endl;
}
return 0;
}
棋盤
題目鏈接:https://www.luogu.org/problem/P3956
其實我們探索一下1這道問題的本質就是一個迷宮中的最短路,用SPFA可以求解最短路。
這里較為繁瑣的就是狀態到狀態之間的擴展,但是並不難。
實現代碼如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 15010, maxm = 40040;
int n, m, a[maxn], b[maxn], c[maxn], d[maxn], val[maxm], cnt[maxn];
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i ++) {
scanf("%d", &val[i]);
cnt[ val[i] ] ++;
}
for (int i = 1; 2+9*i <= n; i ++) {
int tmp = 0;
for (int j = 2+9*i; j <= n; j ++) {
tmp += cnt[j-1-9*i] * cnt[j-1-7*i];
c[j-i] += cnt[j] * tmp;
d[j] += cnt[j-i] * tmp;
}
tmp = 0;
for (int j = n-1-9*i; j >= 1; j --) {
tmp += cnt[j+1+8*i] * cnt[j+1+9*i];
a[j] += cnt[j+2*i] * tmp;
b[j+2*i] += cnt[j] * tmp;
}
}
for (int i = 0; i < m; i ++)
printf("%d %d %d %d\n", a[ val[i] ], b[ val[i] ], c[ val[i] ], d[ val[i] ]);
return 0;
}
跳房子
題目鏈接:https://www.luogu.org/problem/P3957
這道題目我用到了如下算法:
- 線段樹求區間最大值;
- 二分答案;
- DP求每一次枚舉答案g時是否能夠找到 \(\ge k\) 的解法。
題解地址:https://www.cnblogs.com/codedecision/p/11753024.html
作者:zifeiy