A - Piling Up
1.1思路
其实就是向上取百位的整,需要增加多少,123则为200-123=177;
1.2代码
void solve() {
int n;
cin >> n;
int t = n / 100;
cout << (t + 1) * 100 - n;
}
B - Japanese Cursed Doll
2.1思路
就是判断最少需要多少天,会有大于等于P个人的头发长度会超过T。
用一个while循环判断需要几天,内套一个for循环增加头发长度,并判断人数;
2.2代码
const int N = 510;
void solve() {
int n, t, p;
cin >> n >> t >> p;
int a[N], cnt = 0, day = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] >= t)cnt++;
}
if (cnt >= p) {
cout << 0;
return;
}
p -= cnt;
while (p > 0) {
for (int i = 1; i <= n; i++) {
if (a[i] >= t)continue;//被判断过的就直接跳过
a[i]++;
if (a[i] >= t)p--;//长度够了,人数增加
}
day++;
}
cout << day;
}
C - Avoid K Palindrome 2
3.1思路
题意是寻找s所有字典序没有长度为k的重复子串(s=‘aab’,k=2,长度为k的重复子串就是’aa‘)
首先将s排序为字典序最小的子串,再在do-while循环内判断是否有长度为k的子串。
主要使用库函数:
next_permutation(s.begin(),s.end())
循环字符串s所有的字典序排列(头文件为algorithm)
3.2代码
void solve() {
int n, k;
string s;
cin >> n >> k >> s;
sort(s.begin(), s.end());
int cnt = 0;
do {
bool found = false;
for (int i = 0; i <= n - k; i++) {
bool all = true;
for (int j = 1; j <= k/2; j++)
//内层循环的目的是检查从位置 i 开始的长度为 k 的子串是否是回文。
//s.at(i + j - 1) 获取子串中从起始位置 i 开始的第 j 个字符。
//s.at(i + k + 1 - j - 1) 获取子串中与第 j 个字符对应的从末尾开始的字符。
if (s.at(i + j - 1) != s.at(i + k + 1 - j - 1)) all = false;
if (all) found = true;
}
if (!found) cnt++;
} while (next_permutation(s.begin(), s.end()));//循环所有可能的字符字典序排列
cout << cnt << "\n";
}
D - Palindromic Number
11,22,99也是。
4.1思路
首先处理小于等于10的特殊情况,然后通过减去每个位数下回文数的数量来缩小目标回文数的范围,直到确定目标回文数的位数。接着,构建回文数的一半,去掉最高位的1以生成正确的回文数,最后将这个半边反转并拼接以形成完整的回文数。
4.2代码
void solve() {
ll n;
cin >> n;
if (n <= 10) {
cout << --n;
return;
}
n -= 2;
ll p = 9;
while (n >= p << 1) {
n -= p << 1;
p *= 10;
}
string s = to_string(n % p + p / 9);
cout << s;
if (n < p)s.pop_back();
reverse(s.begin(), s.end());
cout << s;
}
标签:AtCoder,cnt,Beginner,int,题解,void,cin,solve,回文
From: https://blog.csdn.net/2301_79744317/article/details/140751140