社区讨论
55pts 求调!
P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo7hynzx
- 此快照首次捕获于
- 2023/10/27 02:07 2 年前
- 此快照最后确认于
- 2023/10/27 02:07 2 年前
如题,求大佬看看,一个周末了还没看出问题在哪(
感谢!
CPP#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int n, m, k, cnt;
struct pipe {
int l, h;
} p[10005];
int x[10005], y[10005];
bool vis[10005];
int f[10005][1005];
bool check(int t) {
for (int i = 1; i <= m; i++) {
if (f[t][i] != 0x3f3f3f3f) return true;
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
cin >> x[i] >> y[i];
}
for (int i = 0; i < k; i++) {
int tmp;
cin >> tmp;
cin >> p[tmp].l >> p[tmp].h;
vis[tmp] = true;
}
memset(f, 0x3f, sizeof(f));
for (int i = 1; i <= m; i++) {
f[0][i] = 0;
}
for (int i = 1; i <= n; i++) {
if (!vis[i]) {
for (int j = 1; j <= m; j++) {
if (j + y[i - 1] < (vis[i - 1] ? p[i - 1].h : m + 1)) f[i][j] = min(f[i][j], f[i - 1][j + y[i - 1]]);
for (int k = 1; ; k++) {
if (j - k * x[i - 1] <= (vis[i - 1] ? p[i - 1].l : 0)) {
break;
}
f[i][j] = min(f[i][j], f[i - 1][j - k * x[i - 1]] + k);
}
if (j == m) {
if (vis[i - 1]) {
for (int k = p[i - 1].l + 1; k < p[i - 1].h; k++) {
f[i][j] = min(f[i][j], f[i - 1][k] + int(1.0 * (j - k + x[i - 1] - 1) / x[i - 1]));
}
} else {
for (int k = 1; k <= m; k++) {
f[i][j] = min(f[i][j], f[i - 1][k] + int(1.0 * (j - k + x[i - 1] - 1) / x[i - 1]));
}
}
}
}
} else {
for (int j = p[i].l + 1; j < p[i].h; j++) {
if (j + y[i - 1] < (vis[i - 1] ? p[i - 1].h : m + 1) && f[i - 1][j + y[i - 1]] != 0x3f3f3f3f) f[i][j] = min(f[i][j], f[i - 1][j + y[i - 1]]);
for (int k = 1; ; k++) {
if (j - k * x[i - 1] <= (vis[i - 1] ? p[i - 1].l : 0)) break;
f[i][j] = min(f[i][j], f[i - 1][j - k * x[i - 1]] + k);
}
}
}
if (!check(i)) {
break;
}
if (vis[i]) cnt++;
}
int a = 0x3f3f3f3f;
for (int i = 1; i <= m; i++) {
a = min(a, f[n][i]);
// if (f[n][i] != 0x3f3f3f3f) cout << i << " " << f[n][i] << endl;
}
if (a == 0x3f3f3f3f) cout << 0 << endl << cnt << endl;
else cout << 1 << endl << a << endl;
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...