题目链接:uva 11766 - Racing Car Computer
题目大意:有n个人进行比赛,给出每个人的状况,a表示这个人前面有a个人,b表示说这个人后面有b个人。问说最少有多少个人的状态是不成立的。
解题思路:对于一个人来说,在他前面有a个人,在他后面有b个人,那么他的可能排名即为[a+1,n-b],并且隐含的条件就是说其实有n-b-a-1是和该人并排的。
同样的如果有人的区间重叠的,那么他们之间肯定是矛盾的。因为[l1,r1]是并排的存在,[l2,r2]也是并排的存在,如果两个区间重叠,那么重叠的区间[l1,r2],重叠的人数即为r2 - l1 + 1,不满足[l1,r1]的并排人数。
然后需要注意[l,r]最多页只能满足r-l+1个人是成立的。
dp[i]表示说到排名i的位置最多有多少人的假设是成立的。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1005;
int n, w[N][N], dp[N];
void init () {
int a, b;
memset(w, 0, sizeof(w));
for (int i = 0; i < n; i++) {
scanf("%d%d", &a, &b);
w[a+1][n-b]++;
}
}
int solve () {
for (int i = 1; i <= n; i++) {
dp[i] = 0;
for (int j = 0; j < i; j++)
dp[i] = max(dp[i], dp[j] + min(w[j+1][i], i - j));
}
return n - dp[n];
}
int main () {
int cas = 1;
while (scanf("%d", &n) == 1 && n) {
init ();
printf("Case %d: %d\n", cas++, solve());
}
return 0;
}