[CSP-S 2023] 密码锁
考场上我跟个 \(somebody\) 一样,一看就想:一眼乘法原理,乱搞写一下就出来了。
当时我还算了一下暴力好像也不会超时,结果,每天在 yz 日以继日的颓废考试经验,我断定 CSP-S 是不会考这么 \(!\) 复杂的题目的,结果暴力出奇迹,就是枚举模拟。
考试后,一看wc枚举,我断定我就是 sb。
思路
暴力出省一
结论是如果所枚举的密码,和任何一个给定密码相同那么不可累加,变一个密码很好判断,只要看枚举的与给定是否只有一个不同。两个呢?发现变两个时,两个值 $a_i \equiv a_{i + 1} \operatorname{mod}10 $ 那么就可以写出一下代码
#include <bits/stdc++.h>
using namespace std;
int a[10][7], sum[7];
int n;
bool check(int _1, int _2, int _3, int _4, int _5){
for(int i = 1; i <= n; i++){
if(_1 == a[i][1] && _2 == a[i][2] && _3 == a[i][3] && _4 == a[i][4] && _5 == a[i][5])return 0;
sum[1] = (a[i][1] - _1 + 10) % 10, sum[2] = (a[i][2] - _2 + 10) % 10, sum[3] = (a[i][3] - _3 + 10) % 10, sum[4] = (a[i][4] - _4 + 10) % 10, sum[5] = (a[i][5] - _5 + 10) % 10;
int cnt = 0;
for(int j = 1; j <= 5; j++){
if(sum[j] == 0)continue;
cnt++;
if(cnt >= 3)return 0;
if(cnt == 2){
if(sum[j] != sum[j - 1])return 0;
}
}
}
return 1;
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= 5; j++)
cin >> a[i][j];
long long ans = 0;
for(int _1 = 0; _1 <= 9; _1++){
for(int _2 = 0; _2 <= 9; _2++){
for(int _3 = 0; _3 <= 9; _3++){
for(int _4 = 0; _4 <= 9; _4++){
for(int _5 = 0; _5 <= 9; _5++){
ans += check(_1, _2, _3, _4, _5);
}
}
}
}
}
cout << ans;
return 0;
}
标签:return,int,sum,枚举,2023,密码锁,CSP
From: https://www.cnblogs.com/lightstarup/p/17899614.html