思路:
dp
f[i]表示前i个人中说真话最多的人数
转移看代码
/**************************************************************
Problem: 2298
User: DtenSherlock
Language: C++
Result: Accepted
Time:1544 ms
Memory:5880 kb
****************************************************************/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
using namespace std;
const int imax=100000+229;
int n,f[imax];
struct Node{
int a,b;
Node(){};
Node(int _a,int _b) { a=_a; b=_b;}
bool operator < (const Node &rhs) const{
return a<rhs.a||(a==rhs.a && b<rhs.b);
}
};
vector<int> s[imax];
map<Node,int> q;
void iread()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int aa,bb;
scanf("%d%d",&aa,&bb);
aa++; bb=n-bb;
if(aa>bb) continue;
q[Node(aa,bb)]++;
if(q[Node(aa,bb)]==1) s[bb].push_back(aa);
}
}
void iwork()
{
for(int i=1;i<=n;i++)
{
f[i]=f[i-1];
int Max=s[i].size();
for(int j=0;j<Max;j++)
{
int nowl=s[i][j];
f[i]=max(f[i],f[nowl-1]+min(i-nowl+1,q[Node(nowl,i)]));
}
}
printf("%d\n",n-f[n]);
}
int main()
{
iread();
iwork();
return 0;
}