- 2014
T3
- @ 2025-10-5 15:08:55
#include<bits/stdc++.h>
using namespace std;
const int N = 10010, M = 1010, INF = 0x3f3f3f3f;
int up[N], down[N], l[N], r[N];
int f[N][M];
int main()
{
int n, m, k;
cin >> n >> m >> k;
for(int i = 0; i < n; i++)
cin >> up[i] >> down[i];
for(int i = 1; i <= n; i++) l[i] = 0, r[i] = m + 1;
for(int i = 1; i <= k; i++)
{
int x;
cin >> x;
cin >> l[x] >> r[x];
}
f[0][0] = INF;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= m; j++)
f[i][j] = INF;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++)
{
if(j >= up[i - 1])
{
//点一次
f[i][j] = min(f[i][j], f[i - 1][j - up[i - 1]] + 1);
//点非一次
f[i][j] = min(f[i][j], f[i][j - up[i - 1]] + 1);
}
if(j == m)
{
for(int k = j - up[i - 1]; k <= m; k++)
{
f[i][j] = min(f[i][j], f[i - 1][k] + 1);
f[i][j] = min(f[i][j], f[i][k] + 1);
}
}
}
for(int j = 1; j <= m; j++)
{
if(j + down[i - 1] <= m)
f[i][j] = min(f[i][j], f[i - 1][j + down[i - 1]]);
}
for(int j = 0; j <= l[i]; j++) f[i][j] = INF;
for(int j = r[i]; j <= m; j++) f[i][j] = INF;
}
int ans1 = INF;
for(int i = 1; i <= m; i++) ans1 = min(ans1, f[n][i]);
if(ans1 < INF)
{
cout << 1 << endl << ans1 << endl;
return 0;
}
int last = 1;
for(int i = 1; i <= n; i++)
{
bool ok = false;
for(int j = 1; j <= m; j++)
if(f[i][j] < INF) ok = 1;
if(ok == false)
{
last = i;
break;
}
}
int ans2 = 0;
for(int i = 1; i < last; i++)
if(l[i] > 0 or r[i] <= m)
++ ans2;
cout << 0 << endl << ans2;
return 0;
}
/*
状态表示: f[i][j] : 到第i列高度为j的最小点击数
枚举第i-1列点k次屏幕 f[i - 1][j - k*up[i - 1]] + k;
f[i][j] = min(f[i][j], f[i - 1][j - up[i - 1]] + 1);
f[i][j] = min(f[i][j], f[i][j - up[i - 1]] + 1);
*/
0 条评论
目前还没有评论...