关于刷表和填表
查看原帖
关于刷表和填表
378346
expnoi楼主2022/10/15 13:14
#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?

2022/10/15 13:14
加载中...