1 条题解

  • 0
    @ 2025-9-10 8:49:47

    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
    上传者