A. 简单判断
一张纸币的面值为 100 100 100,至少 1 1 1 张,给定钱数 X X X,判断是否可能是钱包里的钱
- 判断是否是 100 100 100 的倍数
- 判断 X X X 是否为 0 0 0
#include<bits/stdc++.h>
using namespace std;
int x;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> x;
if (x % 100 == 0 && x) cout << "Yes\n";
else cout << "No\n";
return 0;
}
B. 最小循环移位
这原本是字符串算法中的一个很经典的问题:最小循环移位,复杂度为 O ( ∣ S ∣ ) O(|S|) O(∣S∣)
在这里他弱化了 ∣ S ∣ |S| ∣S∣ 的数据范围,所以暴力就可以完成
循环移位一共有 ∣ S ∣ |S| ∣S∣ 个字符串,每个字符串的长度为 ∣ S ∣ |S| ∣S∣,再排序一边即可或遍历找最大最小串
总时间复杂度: O ( ∣ S ∣ 2 log ∣ S ∣ ) O(|S|^2\log |S|) O(∣S∣2log∣S∣) 或 O ( ∣ S ∣ 2 ) O(|S|^2) O(∣S∣2)
#include<bits/stdc++.h>
using namespace std;
string s;
vector<string> vt;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> s;
for (int i = 0; i < (int) s.size(); i++) {
vt.push_back(s.substr(i) + s.substr(0, i));
}
sort(vt.begin(), vt.end());
cout << vt[0] << endl << vt.back() << endl;
return 0;
}
C. 二分
因为每段保险丝的长度和燃烧速度都是不同的,所以我们要用数学方法算出解析解是非常难的
一个很方便的方法是二分燃烧时间 t t t
令 L e n = ∑ i = 1 N A i Len = \sum\limits_{i = 1}^{N}A_i Len=i=1∑NAi 表示总长度
对于一个 t t t,我们可以 O ( N ) O(N) O(N) 计算左边燃烧的长度 L l e n Llen Llen,以及右边燃烧的长度 R l e n Rlen