题目描述:
qwq.
题目分析:
转化为求最多多少个人讲真话
dp[i]为前i个人多少讲了真话
sum[i,j]表示名次区间 i,j有多少人
那么dp[i]=max(dp[j]+sum[i,j])(j < i)
用map来存区间个数
题目链接:
Ac 代码:
#include <cstdio>
#include <map>
#include <vector>
std::map<std::pair<int,int>,int> s;
std::vector <int> d[110000];
int n;
int dp[110000];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
int l=a+1,r=n-b;
s[std::make_pair(l,r)]++;
if(s[std::make_pair(l,r)]==1) d[r].push_back(l);
}
for(int i=1;i<=n;i++)
{
dp[i]=dp[i-1];
for(int j=0;j<d[i].size();j++)
dp[i]=std::max(dp[i],dp[d[i][j]-1]+std::min(i-d[i][j]+1,s[std::make_pair(d[i][j],i)]));
}
printf("%d\n",n-dp[n]);
return 0;
}