题目顺序按开题顺序排列

# I - The Easiest 问题

# 题目大意

给定一行字符串,问其中有多少个小写字母

# 题解

C++
1
2
3
4
5
6
7
8
9
void solve() {
string s;
getline(cin, s);
int cnt = 0;
for (char c : s)
if (islower(c))
cnt++;
cout << cnt << endl;
}

# L - Recharge

# 题目大意

你现在有一个电池,这块电池有 kk 格电,现在,有两种充电站

  • xx 个第一种充电站,可以加 11 格电
  • yy 个第二种充电站,可以加 22 格电

若你现在有 k1k-1 格电,那么使用第二种充电站的话,则会充满这块电池但是就浪费了一格电
问:最多能充满多少块这样的电池?

# 数据范围

  • tt 组数据,1t2×1051 \le t \le 2 \times 10^5
  • 1k1091 \le k \le 10^9
  • 0x,y1090 \le x,y \le 10^9

# 题解

尽量先用加 22 格电的充电站先充,针对 kk 的奇偶性进行分类讨论

  • kk 是偶数
    • 那么需要消耗 t = k / 222 即可拼成一个 kk
    • 所以,只用 22 的话,可以凑出 a = y / t 个,还剩下 y = y - a * t22
    • 那么剩下的就可以直接散着拼了,也就是有 (x + 2 * y) / k
    • 最终答案为 a + (x + 2 * y) / k ,此处 yy 为减之后的 yy
  • kk 是奇数
    • 那么需要消耗 t = (k - 1) / 222 和一个 11 即可拼成一个 kk
    • 所以可以先拼出 a = min(y / t, x) 个,还剩下 y = y - a * t22x = x - t11
    • 剩下的散着拼,但是这里还要考虑到浪费电的那种充电情况
      • 如果 11 的还有剩余,那么和前面的情况,也就是有 (x + 2 * y) / k
        • 那么最后答案就是 a + (x + 2 * y) / k ,此处的 xxyy 均为减之后的 xxyy
      • 如果 11 的没有剩余,那么就全部用 22 拼,只能考虑浪费,也就是有 y / ((k + 1) / 2)
        • 那么最后答案就是 a + y / ((k + 1) / 2) ,此处的 xxyy 均为减之后的 xxyy

这题还有一个坑是,kk 的范围是 1k1091 \le k \le 10^9,那么当 k=1k = 1 时,我们前面讨论中的除 k1k - 1 就会 RERE
再添加一个特判,当 k=1k=1 时,答案是 x+yx+y

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void solve () {
int k, x, y;
cin >> k >> x >> y;

if (k & 1) {
int t = (k - 1) / 2;
int a1 = min(y / t, x);
y -= a1 * t, x -= a1;
if (x == 0)
cout << a1 + y / ((k + 1) / 2) << endl;
else
cout << a1 + (x + 2 * y) / k << endl;
}
else {
int t = k / 2, a1 = y / t;
y -= a1 * t;
cout << a1 + (x + 2 * y) / k << endl;
}
}