下午,开了靶形数独,原本想自己做。结果写了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
//本文写有十分匆忙,之后可能会稍微改进。