猜猜是哪题代码?或猜猜题目难度
  • 板块灌水区
  • 楼主c22j33c43
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/31 16:47
  • 上次更新2024/10/31 17:28:33
查看原帖
猜猜是哪题代码?或猜猜题目难度
1163591
c22j33c43楼主2024/10/31 16:47
#include<bits/stdc++.h>
using namespace std;
const int inf=100000000;
int n,m,h,t[11][5],g[16],p[11],ans,a[11],b[11],q[11][102][102],xa[11],xb[11],ya[11],yb[11],f[102][102],rem[16],p1=0,r[101][101],huihe,fj[11];
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void dp(int pan,int hui,int xx,int yy,int HP){
	if(xx>a[hui]||yy>b[hui]||xx<1||yy<1) return;
	if(t[hui][4]==1&&t[hui][2]==1&&xx==a[hui]&&yy==1) return;
	else if(t[hui][4]==1&&t[hui][1]==1&&xx==a[hui]&&yy==b[hui]) return;
	else if(t[hui][3]==1&&t[hui][2]==1&&xx==1&&yy==1) return;
	else if(t[hui][3]==1&&t[hui][1]==1&&xx==1&&yy==b[hui]) return;
	r[xx][yy]=1;
	if(r[xx-1][yy]==0&&t[hui][3]==1) dp(pan,hui,xx-1,yy,HP);
	if(r[xx+1][yy]==0&&t[hui][4]==1) dp(pan,hui,xx+1,yy,HP);
	if(r[xx][yy-1]==0&&t[hui][2]==1) dp(pan,hui,xx,yy-1,HP);
	if(r[xx][yy+1]==0&&t[hui][1]==1) dp(pan,hui,xx,yy+1,HP);
	if(pan==0||(pan==1&&q[hui][xx][yy]<=HP/2)){
		int w=f[xx][yy];
		if(t[hui][3]==1) f[xx][yy]+=f[xx-1][yy];
		else f[xx][yy]+=f[xx+1][yy];
		if(t[hui][2]==1) w+=f[xx][yy-1];
		else w+=f[xx][yy+1];
		f[xx][yy]=min(f[xx][yy],w);
	} 
	else{
		int w=f[xx][yy];
		if(t[hui][3]==1) f[xx][yy]+=f[xx-1][yy];
		else f[xx][yy]+=f[xx+1][yy];
		if(t[hui][2]==1) w+=f[xx][yy-1];
		else w+=f[xx][yy+1];
		f[xx][yy]=min(f[xx][yy],w)-p[hui];
	}
	return;
}
void find(int jia,int k,int hp){
	if(p1==1) return;
	if(k==n+1){
		int an=0;
		for(int i=1;i<=h;i++){
			if(rem[i]==0) an+=g[i];
		}
		p1=1;
		ans=2*an+hp;
		cout<<ans;
		return;
	}
	memset(r,0,sizeof(r));
	for(int i=0;i<=a[k]+1;i++){
		for(int j=0;j<=b[k]+1;j++){
			if(i==0||j==0||i==a[k]+1||j==b[k]+1) {
				f[i][j]=inf;}
			else f[i][j]=q[k][i][j];
		}
	}
	if(jia==0){
		dp(1,k,xb[k],yb[k],hp);
		fj[k]=f[xb[k]][yb[k]];
		if(hp-fj[k]>0){
			find(0,k+1,hp-fj[k]);
			find(1,k+1,hp-fj[k]);
		}
		else huihe=max(huihe,k);
	}
	else if(jia==1){
		dp(0,k,xb[k],yb[k],hp);
		fj[k]=f[xb[k]][yb[k]];
		for(int i=1;i<=h;i++){
			if(rem[i]==0&&min(m,hp+g[i])-fj[k]>0){
				rem[i]=1;
				if(min(m,hp+g[i])-fj[k]>0){
					find(0,k+1,min(m,hp+g[i])-fj[k]);
					find(1,k+1,min(m,hp+g[i])-fj[k]);
				}
				else huihe=max(huihe,k);
				rem[i]=0;
				break; 
			}
		}
	} 
	return;
}
int main(){
	//freopen("1.in","r",stdin);
	n=read();m=read();h=read();
	for(int i=1;i<=h;i++) g[i]=read();
	sort(g+1,g+h+1);
	for(int i=1;i<=n;i++) p[i]=read();
	for(int k=1;k<=n;k++){
		a[k]=read();b[k]=read();
		xa[k]=read();ya[k]=read();xb[k]=read();yb[k]=read();
		int e=read();
		t[k][e]=1;
		e=read();
		t[k][e]=1;
		for(int i=1;i<=a[k];i++){
			for(int j=1;j<=b[k];j++){
				q[k][i][j]=read();
			}
		}
	}
	p1=0;
	find(0,1,m);
	if(p1==0) cout<<huihe;
	return 0;
}
2024/10/31 16:47
加载中...