社区讨论
求助
学术版参与者 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 条回复,欢迎继续交流。
正在加载回复...