Homework Introduction

#include <bits/stdc++.h>
using namespace std;
const int N = 505;
int book[N][N],cnt;
int n,m,a[N][N],nxt[4][2]={0,1,0,-1,1,0,-1,0};
int b[N*N][2];
void dfs(int x,int y,int H){
	book[x][y] = 1;
	for(int i=0;i<4;i++){
		int nx = x+nxt[i][0];
		int ny = y+nxt[i][1];
		if(nx>=1 && nx<=n && ny>=1 && ny<=m){
			if(book[nx][ny]==0 && abs(a[nx][ny]-a[x][y])<=H){
				dfs(nx,ny,H);
			}
		}
	}
}
int check(int x)
{
	memset(book,0,sizeof(book));
	dfs(b[1][0],b[1][1],x);
	for(int i=1;i<=cnt;i++){
		if(book[b[i][0]][b[i][1]]==1){
			continue;
		}
		else return 0;
	}
	return 1;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int x;
			cin>>x;
			if(x==1){
				b[++cnt][0] = i;
				b[cnt][1] = j;
			}
		}
	}
	int res = 0;
	int l=0,r=1e9;
	while(l<=r){
		int mid = (l+r)>>1;
		if(check(mid)){
			res = mid;
			r = mid-1;
		}
		else l = mid+1;
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 705;
int n,m,a[N][N];
struct node{
	int x,y,val;
}p[N*N];
int book[N][N];
bool cmp(node a,node b){
	return a.val>b.val;
}
int nxt[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
void dfs(int x,int y){
	book[x][y] = 1;
	for(int i=0;i<8;i++){
		int nx = x+nxt[i][0];
		int ny = y+nxt[i][1];
		if(nx>=1 && nx<=n && ny>=1 && ny<=m){
			if(book[nx][ny]==0 && a[nx][ny]<=a[x][y]){
				dfs(nx,ny);
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	int cnt = 0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			p[++cnt] = {i,j,a[i][j]};
		}
	}
	sort(p+1,p+cnt+1,cmp);
	int res = 0;
	for(int i=1;i<=cnt;i++){
		if(book[p[i].x][p[i].y]==0){
			res++;
			dfs(p[i].x,p[i].y);
		}
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 40;
int n,m,Final,res=1e18;
int e[N];//00010101
map<int,int>mp;
void dfs(int x,int limit,int cost,int status){
	//cout<<x<<" "<<limit<<" "<<cost<<" "<<status<<endl;
	if(limit<=n/2){
		//前半部分
		if(mp.count(status))
			mp[status] = min(mp[status],cost);
		else mp[status] = cost;
		if(x>limit)return;
		dfs(x+1,limit,cost+1,status^e[x]);
		dfs(x+1,limit,cost,status);
	}
	else{
		int tmp = Final^status;
		
		if(mp.count(tmp)){
			res = min(res,cost+mp[tmp]);
		}
		if(x>limit){
			return;
		}
		dfs(x+1,limit,cost,status);
		dfs(x+1,limit,cost+1,status^e[x]);
	}
}
signed main()
{
	mp[0] = 0;
	cin>>n>>m;
	Final = (1LL<<n)-1LL;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		e[x] |= (1LL<<(y-1LL));
		e[y] |= (1LL<<(x-1LL));
	}
	for(int i=1;i<=n;i++){
		e[i] |= (1LL<<(i-1LL));	
	}
	dfs(1,n/2,0,0);
	dfs(n/2+1,n,0,0);
	cout<<res<<endl;
	return 0;
}
/*
1.前一半比赛花费的金额[1,1,1,1,3,4,5,6,7,8,9,10,11,12]
2.后一半比赛花费的金额[4,5,6,7,8,9,10,11,11,11,11,11]
*/
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 45;
int n,m,a[N];
vector<int>p1,p2;
void dfs(int x,int limit,int cost){
	if(cost>m)return;
	if(limit==n/2){
		if(x>limit){
			p1.push_back(cost);
			return;
		}
		dfs(x+1,limit,cost+a[x]);
		dfs(x+1,limit,cost);
	}
	else{
		if(x>limit){
			p2.push_back(cost);
			return;	
		}
	
		dfs(x+1,limit,cost+a[x]);
		dfs(x+1,limit,cost);
	}
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(1,n/2,0);
	dfs(n/2+1,n,0);
	sort(p1.begin(),p1.end());
	int res = 0;
	for(int i=0;i<p2.size();i++){
		int tmp = upper_bound(p1.begin(),p1.end(),m-p2[i])-p1.begin();
		res+=tmp;
	}
	cout<<res<<endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 25;
/*
mp[i]和为i的所有状态
*/
int n,a[N],sum,ans[2000005];
unordered_map<int,vector<int>>mp;
void dfs(int x,int limit,int status,int cost){
	if(limit==n/2){
		
		if(x>limit){
			mp[cost].push_back(status);
			return;
		}
	}
	else{
		if(x>limit){
		//	cout<<cost<<" "<<status<<endl;
			for(int i=0;i<mp[cost].size();i++){
				int t = mp[cost][i];
				//cout<<t<<" "<<status<<endl;
				ans[status|t] = 1;
			}
			return;
		}
	}
	dfs(x+1,limit,status,cost);
	dfs(x+1,limit,status|(1<<(x-1)),cost+a[x]);
	dfs(x+1,limit,status|(1<<(x-1)),cost-a[x]);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(1,n/2,0,0);
	dfs(n/2+1,n,0,0);
	int res = 0;
	for(int i=1;i<=(1<<n)-1;i++){
		res+=ans[i];
	}
	cout<<res<<endl;
	return 0;
}

Problem

Please claim the assignment to see the problems.
Status
Live...
Problem
35
Open Since
2025-11-3 0:00
Deadline
2026-1-31 23:59
Extension
24 hour(s)