今天你AC了吗?
每日两题day65
一、基础题
题目:P1008 [NOIP 1998 普及组] 三连击 - 洛谷
思路:
暴力遍历每个三位数及其倍数,拆开检查是否是1~9的序列
代码:
cpp
#include <bits/stdc++.h>
using i64 = long long;
constexpr int inf = 2147483647;
int main() {
for (int i = 100; i * 3 <= 999; i++) {
int j = 4;
std::set<char> x;
while (--j) {
std::string s = std::to_string(j * i);
for (auto u: s) {
x.insert(u);
}
if (x.size() == 9 && *x.begin() != '0') {
printf("%d %d %d\n", i, i * 2, i * 3);
}
}
}
return 0;
}
二、提高题
题目:P1098 [NOIP 2007 提高组] 字符串的展开 - 洛谷
思路:
遍历s,遇到'-'时检查前后是否满足展开条件,再按是否星号->是否数字->是否大小写,最后统一处理是否翻转的顺序分类处理(ps:不保证是最简写法),处理下标(/指针/迭代器)时注意越界问题。
代码:
cpp
#include <bits/stdc++.h>
using i64 = long long;
constexpr int inf = 2147483647;
int main() {
int a, b, c;
std::string s;
std::cin >> a >> b >> c >> s;
std::string r;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '-' && i > 0 && s[i - 1] != '-' && i < s.size() - 1 && s[i + 1] != '-') {
if (s[i + 1] <= s[i - 1] || abs(s[i + 1] - s[i - 1]) > 26) {
r.push_back(s[i]);
} else {
int x = r.size();//记录展开字符串的第一个字符位置
if (a != 3) {
for (int ii = s[i - 1] + 1; ii <= s[i + 1] - 1; ii++) {
for (int j = 0; j < b; j++) {
r.push_back((char) ii);
}
}
if (a == 2 && s[i - 1] >= 'a' && s[i - 1] <= 'z') {
for (int j = x; j < r.size(); j++) {
r[j] += 'A' - 'a';
}
}
} else {
int cnt = s[i + 1] - s[i - 1] - 1;
cnt *= b;
if (cnt <= 0) cnt = 0;
while (cnt--) {
r.push_back('*');
}
}
if (c == 2) {
std::reverse(r.begin() + x, r.end());
}
}
} else {
r.push_back(s[i]);
}
}
std::cout << r;
return 0;
}