题意
思考
感觉这题思路挺不错的
考虑单独的一个人的 (a_i,b_i),那么就是有 (n - a_i - b_i) 个人分数相同,而这个分数相同的区间是 ([a_i+1,n-b_i]),要满足合理性,我们应该选出若干个不相交的区间,使得权值最大(这个权值也就是区间范围相同的人数),这个问题就很好解决了。(代码中 (f[i]) 表示前 (i) 个人最多的说真话人数)
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, a[N], b[N], f[N];
vector<int> sum[N];
map<pair<int, int>, int> mp;
int main(){
cin >> n;
for(int i=1; i<=n; i++){
cin >> a[i] >> b[i];
int l = a[i] + 1, r = n - b[i]; if(l > r) continue;
if(++ mp[ make_pair(l, r) ] == 1) sum[r].push_back(l);
}
for(int i=1; i<=n; i++){
f[i] = f[i - 1];
for(int j=0; j<sum[i].size(); j++){
int l = sum[i][j];
f[i] = max(f[i], f[l - 1] + min(mp[make_pair(l, i)], i - l + 1) );
}
}
cout << n - f[n];
return 0;
}
总结
注意对于问题的转换