1 条题解
-
0
C++ :
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,c,b,ans,f[110000],first[110000],tot; struct node { int x,y,wgt; }a[100005]; struct bian { int from,to,next; }s[100004]; void add(int x,int y) { s[++tot].from=x; s[tot].to=y; s[tot].next=first[x]; first[x]=tot; } int comp(const node &a,const node &b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int maxc(int a,int b){return a>b?a:b;} int main() { //freopen("a.in","r",stdin); //freopen("a.ans","w",stdout); memset(first,-1,sizeof(first)); scanf("%d",&n); m=n,ans=0; for(int i=1;i<=n;++i) { scanf("%d%d",&c,&b); a[i].x=c+1,a[i].y=n-b; if(a[i].x>a[i].y)//把能直接判断出说谎的去掉 { ans++; a[i].x=a[i].y=0x3f3f3f3f; } } sort(a+1,a+n+1,comp); n-=ans; ans=0; //a[1].wgt=1; for(int i=1;i<=n;++i)//把排名相同的人化成一个分数段 { a[i].wgt=1; if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y) { a[i].wgt+=a[i-1].wgt; a[i-1].x=a[i-1].y=0x3f3f3f3f; a[i-1].wgt=0; ans++; if(a[i].wgt>a[i].y-a[i].x+1) a[i].wgt=a[i].y-a[i].x+1;//段中最多的人数 } } sort(a+1,a+n+1,comp); n-=ans; for(int i=1;i<=n;++i) add(a[i].y,i); for(int i=1;i<=m;++i) { f[i]=f[i-1]; for(int j=first[i];j!=-1;j=s[j].next) { int k=s[j].to; f[i]=maxc(f[i],f[a[j].x-1]+a[k].wgt); } } printf("%d",m-f[m]); // while(1); }
- 1
信息
- ID
- 3332
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者