30分求调
查看原帖
30分求调
347214
IGA_Indigo楼主2023/10/15 19:35
#include<bits/stdc++.h>
using namespace std;
int a[505][505],f[505],cxt[1000005];
int n,m,dd;
bool s[505][505],hs[505][505];
void js(int i,int j){
	if(i-1>0&&a[i-1][j]<a[i][j]&&s[i-1][j]==0){
		if(i-1==1&&cxt[a[1][j]]>1){
			cxt[a[1][j]]--;
		}
		s[i-1][j]=1;
		hs[i-1][j]=1;
		dd++;
		js(i-1,j);
	}
	if(i+1<=n&&a[i+1][j]<a[i][j]&&s[i+1][j]==0){
		if(i+1==1&&cxt[a[1][j]]>1){
			cxt[a[1][j]]--;
		}
		s[i+1][j]=1;
		hs[i+1][j]=1;
		dd++;
		js(i+1,j);
	}
	if(j+1<=m&&a[i][j+1]<a[i][j]&&s[i][j+1]==0){
		if(i==1&&cxt[a[1][j+1]]>1){
			cxt[a[1][j+1]]--;
		}
		s[i][j+1]=1;
		hs[i][j+1]=1;
		dd++;
		js(i,j+1);
	}
	if(j-1>=1&&a[i][j-1]<a[i][j]&&s[i][j-1]==0){
		if(i==1&&cxt[a[1][j-1]]>1){
			cxt[a[1][j-1]]--;
		}
		s[i][j-1]=1;
		hs[i][j-1]=1;
		dd++;
		js(i,j-1);
	}
}
bool cz(){
	for(int j=1;j<=m;j++){
			if(s[n][j]==0){
				return 1;
			}
		}
	return 0;
}
int cz2(){
	int sum=0;
	for(int j=1;j<=m;j++){
		if(s[n][j]==0){
			sum++;
		}
	}
	return sum;
}
bool cmp(int a,int b){
	return a>b;
}
int bjj[505];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(i==1){
				f[j]=a[i][j];
			}
		}
	}
	stable_sort(f+1,f+1+m,cmp);//f[i]存贪心第i个浇水点应该是下标为a[1][f[i]]
	for(int i=1;i<=m;i++){
		cxt[f[i]]++;//cxt[]待浇水区等于这个数的重复点 
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m;j++){
			if(f[i]==a[1][j]&&bjj[j]==0){
				f[i]=j;
				bjj[j]=1;
				break;
			}
		}
	}
	int gs=0,i=1;
	bool bj=0;
	while(f[i]!=0){
		if(s[1][f[i]]==1){
			i++;
			continue;
		}
		int bbj=0;
		if(cxt[a[1][f[i]]]>1){
			js(1,f[i]);
			int maxx=dd,maxb=i;
			dd=0;
			for(int k=1;k<=n;k++){
				for(int kk=1;kk<=m;kk++){
					if(hs[k][kk]){
						s[k][kk]=0;
					}
				}
			}
			memset(hs,0,sizeof(hs));
			for(int j=i;j<=m;j++){
				if(cxt[a[1][f[i]]]<=1){
					break;
				}
				if(s[1][f[i]]==s[1][f[j]]){
					memset(hs,0,sizeof(hs));
					js(1,f[j]);
					if(maxx<dd){
						maxb=j;
						maxx=dd;
					}
					dd=0;	
				}
				for(int k=1;k<=n;k++){
					for(int kk=1;kk<=m;kk++){
						if(hs[k][kk]){
							s[k][kk]=0;
						}
					}
				}
				memset(hs,0,sizeof(hs));
			}
			cxt[a[1][f[i]]]--;
			js(1,f[maxb]);
			gs++;
			i++;
			bbj=1;
			if(!cz()){
				bj=1;
				break;
			}
		}
		if(bj==1){
			break;
		}
		dd=0;
		memset(hs,0,sizeof(hs));
		if(bbj==1){
			continue;
		}
		s[1][f[i]]=1;
		js(1,f[i]);
		gs++;
		i++;
		if(!cz()){
			bj=1;
			break;
		}
		dd=0;
		memset(hs,0,sizeof(hs));
	}
	if(bj==1){
		cout<<1<<endl<<gs;
	}
	else{
		cout<<0<<endl;
		cout<<cz2();
	}
	return 0;
}
2023/10/15 19:35
加载中...