社区讨论

求助

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo25p41x
此快照首次捕获于
2023/10/23 08:25
2 年前
此快照最后确认于
2023/11/03 08:42
2 年前
查看原帖
CPP
 while(y>=0&&x+y>num[i][j]+f[i][x]+dp[j][y]) y--;
这行在干嘛啊
CPP
#include <bits/stdc++.h>
using namespace std;
#define N 205
struct node{
	int l,r;
}t[N];
int n,a[N],tot,f[2*N][N],dp[2*N][N],g[2*N][2*N];

int num[N][N];
void calculate()
{
	memset(num,0,sizeof(num));
	for(int i=1;i<=n;i++)
	{
		node h; h=t[i];
		for(int j=1;j<=h.l;j++) num[j][h.r]++;
	}
	for(int i=1;i<=tot;i++)
		for(int j=i+1;j<=tot;j++)
			num[i][j]+=num[i][j-1];
	/*for(int i=1;i<=tot;i++)
		for(int j=i+1;j<=tot;j++)
			cout<<i<<" "<<j<<" "<<num[i][j]<<endl;*/
	return;
}

int main()
{
	memset(f,-10000,sizeof(f));
	memset(dp,-10000,sizeof(f));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i],&a[i+n]);
		a[i+n]+=a[i];
		t[i].l=a[i]; t[i].r=a[i+n];
	}
	sort(a+1,a+1+2*n);
	tot=unique(a+1,a+1+2*n)-a-1;
	for(int i=1;i<=n;i++)
	{
		t[i].l=lower_bound(a+1,a+1+tot,t[i].l)-a;
		t[i].r=lower_bound(a+1,a+1+tot,t[i].r)-a;
	}
	calculate();
	for(int i=1;i<=tot;i++)
	{
		for(int j=0;j<num[1][i];j++)
		{
			for(int k=1;k<=i;k++)
			{
				if(f[i][j]<f[k][j]+num[k][i]&&num[1][k]>=j) f[i][j]=f[k][j]+num[k][i];
				if(f[i][j]<f[k][j-num[k][i]]) f[i][j]=f[k][j-num[k][i]];
			}
		}
		f[i][num[1][i]]=0;
		/*for(int j=0;j<num[1][i];j++)
		{
			ff[i]=max(ff[i],min(f[i][j],j));
		}*/
	}
	for(int i=tot;i>=1;i--)
	{
		for(int j=0;j<num[i][tot];j++)
		{
			for(int k=tot;k>i;k--)
			{
				if(dp[i][j]<dp[k][j]+num[i][k]&&num[k][tot]>=j) dp[i][j]=dp[k][j]+num[i][k];
				if(dp[i][j]<dp[k][j-num[i][k]]) dp[i][j]=dp[k][j-num[i][k]];
			}
		}
		dp[i][num[i][tot]]=0;
		/*for(int j=0;j<num[i][tot];j++)
		{
			dpp[i]=max(dpp[i],min(dp[i][j],j));
		}*/
	}
	for(int i=1;i<=tot;i++)
        for(int j=i;j<=tot;j++){
            g[i][j]=0;
            for(int x=0,y=n;x<=n;x++){
                while(y>=0&&x+y>num[i][j]+f[i][x]+dp[j][y]) y--;
                if(y>=0) g[i][j]=max(g[i][j],x+y);
            }
        }
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(f[tot][i]>=i) ans=max(ans,i);
		else ans=max(ans,f[tot][i]);
	}
	cout<<ans<<endl;
	for(int i=1;i<=n;i++)
	{
		node h=t[i];
		ans=0;
		for(int j=1;j<=h.l;j++)
            for(int k=h.r;k<=tot;k++)
                ans=max(ans,g[j][k]);
        printf("%d\n",ans);
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...