#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')w=-1;
c=getchar();
}
while(c>='0'&&c<='9')s=(s<<3)+(s<<1)+c-'0',c=getchar();
return s*w;
}
inline void print(int x)
{
if(x<0)putchar('-'),x=-x;
if(x>=10)print(x/10);
putchar(x%10+'0');
}
int f[1010][10001],X[10010],Y[10010],ans=0,n,m,k,now=1;
struct node{
int P,L,H;
}a[10010];
inline bool cmp(node a,node b){
return a.P<b.P;
}
signed main()
{
n=read(),m=read(),k=read();
for(int i=1;i<=n;++i)X[i]=read(),Y[i]=read();
for(int i=1;i<=k;++i)a[i].P=read(),a[i].L=read(),a[i].H=read();
sort(a+1,a+k+1,cmp);
for(int i=0;i<=1000;i++)
{
for(int j=0;j<=10000;j++)f[i][j]=1e15;
}
for(int i=1;i<=m;++i)f[0][i]=0;
for(int i=0;i<n;++i)
{
for(int j=Y[i+1]+1;j<=m;++j)f[(i+1)][j-Y[i+1]]=min(f[i][j],f[(i+1)][j-Y[i+1]]);
for(int j=1;j<m;++j)
{
f[(i+1)][min(j+X[i+1],m)]=min(min(f[(i+1)][j],f[i][j])+1,f[(i+1)][min(j+X[i+1],m)]);
}
//for(int j=1;j<=m;++j)for(int k=1;j+X[i+1]*(k-1)<m;++k)f[(i+1)][min(j+X[i+1]*k,m)]=min(f[(i+1)][min(j+X[i+1]*k,m)],f[i][j]+k);
if(i+1==a[now].P)
{
for(int j=0;j<=a[now].L;++j)f[(i+1)][j]=1e15;
for(int j=m;j>=a[now].H;--j)f[(i+1)][j]=1e15;
for(int j=1;j<=m;++j)if(f[(i+1)][j]<1e15)ans=now;
++now;
}
f[(i+1)][0]=1e15;
}
int res=1e15;
for(int i=1;i<=m;++i)res=min(res,f[n][i]);
if(res<1e14)
{
puts("1"),print(res);
return 0;
}
puts("0"),print(ans);
return 0;
}
刷表,55pts。
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int s=0,w=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
w=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
s=(s<<3)+(s<<1)+c-'0';
c=getchar();
}
return s*w;
}
inline void print(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>=10)
print(x/10);
putchar(x%10+'0');
return;
}
struct node
{
int p,h,l;
}a[10010];
int x[10010],y[10010],f[10010][1010],n,m,k,cnt=1,ans;
inline bool cmp(node a,node b)
{
return a.p<b.p;
}
int main()
{
n=read();
m=read();
k=read();
for(register int i=1;i<=n;++i)x[i]=read(),y[i]=read();
for(register int i=1;i<=k;++i)a[i].p=read(),a[i].l=read(),a[i].h=read();
sort(a+1,a+k+1,cmp);
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)//初始化
{
f[i][j]=0x3f3f3f3f;
}
for(int j=x[i]+1;j<=x[i]+m;j++)//往上跳,完全背包
{
f[i][j]=f[i-1][j-x[i]]+1<f[i][j-x[i]]+1?f[i-1][j-x[i]]+1:f[i][j-x[i]]+1;;
}
for(int j=m+1;j<=x[i]+m;j++)
{
f[i][m]=f[i][m]<f[i][j]?f[i][m]:f[i][j];
}
for(int j=1;j<=m-y[i];j++)//p=0,01背包
{
f[i][j]=min(f[i][j],f[i-1][j+y[i]]);
}
if(i==a[cnt].p)//有管道
{
ans=0x3f3f3f3f;
for(int j=0;j<=a[cnt].l;j++)
{
f[i][j]=0x3f3f3f3f;
}
for(int j=a[cnt].h;j<=m;j++)
{
f[i][j]=0x3f3f3f3f;
}
for(int j=1;j<=m;j++)
{
ans=min(f[i][j],ans);
}
if(ans==0x3f3f3f3f)
{
puts("0");
print(cnt-1);
return 0;
}
cnt++;
}
}
ans=0x3f3f3f3f;
for(int j=1;j<=m;j++)ans=min(f[n][j],ans);
puts("1");
print(ans);
}
填表,100pts。
mxqz,是刷表有什么问题吗/kel?