题目一
思路:
不管是特殊性质 1 还是特殊性质 2 ,都只有一种情况,那就是回文数一定在中间,要么就是没有回文数
我们根据题目要求,判定中奖的回文数的长度只需要大于等于2即可。那么我们只需要判断最中间的 2(n为偶数时)或 3(n为奇数时)个数字是否是回文数即可。
具体实现:直接暴力判断即可
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
string a, b;
cin >> a >> b;
bool f1 = false, f2 = false;
if(n % 2 == 0) {
int m = n / 2;
if(a[m] == a[m - 1]) f1 = true;
if(b[m] == b[m - 1]) f2 = true;
}
else {
int m = n / 2;
if(a[m - 1] == a[m + 1]) f1 = true;
if(b[m - 1] == b[m + 1]) f2 = true;
}
if(f1 && f2) cout << "All" << endl;
else if(f1) cout << "Ming" << endl;
else if(f2) cout << "Hong" << endl;
else cout << "NO" << endl;
return 0;
}
题目二
思路:
前置知识:对二进制数来说,数字 1 越靠前,表示的数越大。
也就是说如果我们将最后的数字 1 尽可能的往前移动,数变得越大,如果我们将最后的 1 和最前面的 0 交换,这个数会变成最大的数,题目要求我们求第二大的数,那我们将右起数第二个 1 和最前面的 0 交换即可。
具体实现:暴力寻找交换即可
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
// 11001010 --> 11100010
int a, b, k = 2;
for(int i = 0; i < s.length(); i++)
if(s[i] == '0') {
a = i;
break;
}
for(int i = s.length() - 1; i >= 0; i--)
if(s[i] == '1') {
k--;
if(k == 0){
b = i;
break;
}
}
swap(s[a], s[b]);
cout << s << endl;
return 0;
}
题目三
思路:
前置知识:掌握数组旋转的能力,10 以内质数判断
对数组进行旋转预处理:预处理出数组旋转 90°,180°,270°,360° 后的数组,便于后续的使用
对每一个可能的有效区域进行遍历判断是否有效,同时记录有几个大写字母;如果是有效区域,就分别按规则提取数组不旋转,以及旋转 i * 90° 后的字母,挨个输出即可
具体实现:每一阶段均暴力实现即可
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 80;
char num[N][N], alpha[N][N];
int n, m;
int ans;
map<int, int> mp;
int tnum[5][N][N];
bool isPrime(int num) {
if (num <= 1) return false;
for(int i = 2; i <= sqrt(num); i++)
if(num % i == 0) return false;
return true;
}
void be() {
for(int k = 1; k <= 4; k++)
for(int i = 1; i <= n; i++)
for(int j = n; j >= 1; j--)
tnum[k][i][n - j + 1] = tnum[k - 1][j][i];
for(int i = 1; i <= 10; i++) mp[i] = isPrime(i);
}
int cToN(char c) {
if (c >= 'A' && c <= 'Z')
return c - 'A' + 1;
if (c >= 'a' && c <= 'z')
return c - 'a' + 1;
return 0;
}
bool isupper(char x) {
return x >= 'A' && x <= 'Z';
}
int meet(int x, int y) {
if(cToN(alpha[x][y]) != tnum[0][1][1]) return false;
if(cToN(alpha[x + n - 1][y]) != tnum[0][n][1]) return false;
if(cToN(alpha[x + n - 1][y + n - 1]) != tnum[0][n][n]) return false;
if(cToN(alpha[x][y + n - 1]) != tnum[0][1][n]) return false;
if(isupper(alpha[x][y])) ans++;
if(isupper(alpha[x + n - 1][y + n - 1])) ans++;
if(isupper(alpha[x][y + n - 1])) ans++;
if(isupper(alpha[x + n - 1][y])) ans++;
return true;
}
void solve(int x, int y) {
for(int k = 0; k <= ans; k++){
for(int i = x; i <= x + n - 1; i++) {
for(int j = y; j <= y + n - 1; j++) {
if(tnum[k][i - x + 1][j - y + 1] == 1) continue;
if(tnum[k][i - x + 1][j - y + 1] == 0) cout << alpha[i][j];
else if(mp[tnum[k][i - x + 1][j - y + 1]] && isupper(alpha[i][j])) cout << alpha[i][j];
else if(!mp[tnum[k][i - x + 1][j - y + 1]] && !isupper(alpha[i][j])) cout << alpha[i][j];
}
}
}
}
void fun() {
cout<<meet(1,2)<<endl;
for(int i = 1; i <= m - n + 1; i++) {
for(int j = 1; j <= m - n + 1; j++) {
ans = 0;
if(meet(i, j)) solve(i, j);
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
cin >> num[i][j];
tnum[0][i][j] = num[i][j] - '0';
}
}
be();
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
cin >> alpha[i][j];
fun();
return 0;
}
题目四
思路:
暴搜能拿九十分,但是数据有很大的问题
数据问题:如果只有一个空间站的话,根据题目要求,只需要一秒就可以到达,实际样例并不是这样
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int inf = 1e9 + 10;
int m, n;
int b[30], c[30];
int mint = inf;
void dfs(int V, int P, int t, int s) {
if (P > c[s]) s++;
if (s > n) {
mint = min(t, mint);
}
int times;
if (t > m) times = b[m];
else times = b[t];
for (int i = 2; i <= times; i++) {
if (P + V * i > c[s]) continue;
if (P + V * i == c[s]) {
dfs(V * i, P + V * i, t + 1, s + 1);
}
else {
dfs(V * i, P + V * i, t + 1, s);
}
}
}
signed main() {
cin >> m;
for (int i = 1; i <= m; i++) {
cin >> b[i];
}
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> c[i];
}
if (n == 1) {
for (int i = 1; i < c[1]; i++) {
dfs(i, i, 1, 1);
}
}
else {
for (int i = 1; i < c[1]; i++) {
dfs(i, i, 1, 1);
}
dfs(c[1], c[1], 1, 2);
}
cout << mint << endl;
return 0;
}