2024.3.4 学习日志

下午,开了靶形数独,原本想自己做。结果写了BFS发现没法回溯,挂成零分。。。

之后改成DFS,发现TLE了, 看来题解才会。。。

加上点剪枝,先做需要填的空最少的行,就过了。

#include<bits/stdc++.h>
//#define int long long
#define debug puts("原始人,启洞!");
using namespace std;
const int N = 20;

int tot, g[N][N], ans1[N][N], ans;
bool vis[3][N][N], flag;
pair<int, int> line[N], b[90];

struct Date{
	int val, x, y;
}a[N][N];

void init(){
	for(int i = 1; i <= 9; i++){
		if(i == 1 || i == 9){
			for(int j = 1; j <= 9; j++)
				ans1[i][j] = 6;
		}else if(i == 2 || i == 8){
			ans1[i][1] = ans1[i][9] = 6; 
			for(int j = 2; j <= 8; j++)
				ans1[i][j] = 7;
		}else if(i == 3 || i == 7){
			ans1[i][1] = ans1[i][9] = 6;
			ans1[i][2] = ans1[i][8] = 7;
			for(int j = 3; j <= 7; j++)
				ans1[i][j] = 8;
		}else if(i == 4 || i == 6){
			ans1[i][1] = ans1[i][9] = 6;
			ans1[i][2] = ans1[i][8] = 7;
			ans1[i][3] = ans1[i][7] = 8;
			for(int j = 4; j <= 6; j++)
				ans1[i][j] = 9;
		}else if(i == 5){
			ans1[i][1] = ans1[i][9] = 6;
			ans1[i][2] = ans1[i][8] = 7;
			ans1[i][3] = ans1[i][7] = 8;
			ans1[i][4] = ans1[i][6] = 9;
			ans1[i][5] = 10;
		}
	}
	sort(line + 1, line + 1 + 9);
	// for(int i = 1; i <= 9; i++) cout << line[i].second << endl;
	// cout << endl;
	tot = 0;
	for(int i = 1; i <= 9; i++){
		int x = line[i].second;
		// cout << x << endl;
		for(int j = 1; j <= 9; j++){
			b[++tot] = make_pair(x, j);
		}
	}
	for(int i = 1; i <= 9; i++){
		for(int j = 1; j <= 9; j++){
			if(!a[i][j].val) continue;
			vis[0][i][a[i][j].val] = 1;
			vis[1][j][a[i][j].val] = 1;
			vis[2][g[i][j]][a[i][j].val] = 1;
		}
	}
	return;
}

void dfs(int op){
	if(op == 82){
		flag = 1;
		int sum = 0;
		for(int i = 1; i <= 9; i++)
			for(int j = 1; j <= 9; j++)
				sum += ans1[i][j] * a[i][j].val;
		ans = max(ans, sum);
		return;
	}
	int x = b[op].first, y = b[op].second;
	// cout << x << " " << y << endl;
	if(!a[x][y].val){
		for(int i = 9; i >= 1; i--){
			if(!vis[0][x][i] && !vis[1][y][i] && !vis[2][g[x][y]][i]){
				vis[0][x][i] = vis[1][y][i] = vis[2][g[x][y]][i] = 1;
				a[x][y].val = i;
				dfs(op + 1);
				a[x][y].val = 0;
				vis[0][x][i] = vis[1][y][i] = vis[2][g[x][y]][i] = 0;
			}
		}
	}else{
		dfs(op + 1);
	}
	return;
}

int main() {
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	for(int i = 1; i <= 9; i++){
		tot = 0;
		for(int j = 1; j <= 9; j++){
			cin >> a[i][j].val;
			a[i][j].x = i;
			a[i][j].y = j;
			if(!a[i][j].val) tot++;
			if (i >= 1 && i <= 3) {
				if (j >= 1 && j <= 3)  g[i][j] = 1;
				else if (j >= 4 && j <= 6) g[i][j] = 2;
				else g[i][j] = 3;
			}
			if (i >= 4 && i <= 6) {
				if (j >= 1 && j <= 3)  g[i][j] = 4;
				else if (j >= 4 && j <= 6) g[i][j] = 5;
				else  g[i][j] = 6;
			}
			if (i >= 7 && i <= 9) {
				if (j >= 1 && j <= 3)  g[i][j] = 7;
				else if (j >= 4 && j <= 6) g[i][j] = 8;
				else g[i][j] = 9;
			}
		}
		line[i].first = tot;
		line[i].second = i;
	}
	init();
	// for(int i = 1; i <= 81; i++)
		// cout << b[i].first << " " << b[i].second << endl;
	// for(int i = 1; i <= 9; i++){
		// for(int j = 1; j <= 9; j++)
			// cout << ans1[i][j] << " ";
		// cout << endl;
	// }
	// for(int i = 1; i <= 9; i++){
		// for(int j = 1; j <= 9; j++)
			// cout << g[i][j] << " ";
		// cout << endl;
	// }
	dfs(1);
	if(flag) cout << ans << endl;
	else cout << -1 << endl;
    return 0;
}//by hwl

晚上,写了细胞分裂,其实就是质因数分解。写了我一个小时(有点菜了)。

#include<bits/stdc++.h>
#define int long long
#define debug puts("原始人,启洞!");
using namespace std;
const int N = 1e5 + 10;
int a[N];
map<int, int> tot, tot1;
vector<int> v, mp;
signed main() {
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);
	int n, m1, m2;
	cin >> n >> m1 >> m2;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	if(m1 == 1){
		cout << 0 << endl;
		return 0;
	}
	
	for(int i = 2; i <= m1; i++){
		if(m1 % i == 0){
			mp.push_back(i);
			while(m1 % i == 0){
				m1 /= i;
				tot[i]++;
			}
			tot[i] *= m2;
		}
	}
	if(m1 > 1) mp.push_back(m1), tot[m1]++;
	tot[m1] *= m2;
	
	// for(int i : mp)
		// cout << i << " " << tot[i] << endl;
		
	int res = 0x3f3f3f3f;
	for(int i = 1; i <= n; i++){
		bool flag = 1;
		int ans = 1;
		v.clear();
		tot1.clear();
		for(int j : mp){
			int sum = 0;
			int f = a[i];
			while(f % j == 0)
	  			sum++, f /= j;
	  		if(!sum){
	  			flag = 0;
	  			break;
	  		}
	  		else{
	  			if(sum >= tot[j])
	  				ans = max(ans, 1ll);
				else ans = max(ans, tot[j] / sum + (tot[j] % sum == 0ll ? 0ll : 1ll));
				// cout << ans << endl;
	  		}
		}
		if(!flag) continue;
		res = min(res, ans);
	}
	
	if(res == 0x3f3f3f3f) cout << -1 << endl;
	else cout << res << endl;
    return 0;
}//by hwl

//本文写有十分匆忙,之后可能会稍微改进。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值