A. 简单判断
一张纸币的面值为 100100100,至少 111 张,给定钱数 XXX,判断是否可能是钱包里的钱
- 判断是否是 100100100 的倍数
- 判断 XXX 是否为 000
#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∣2log∣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. 二分
因为每段保险丝的长度和燃烧速度都是不同的,所以我们要用数学方法算出解析解是非常难的
一个很方便的方法是二分燃烧时间 ttt
令 Len=∑i=1NAiLen = \sum\limits_{i = 1}^{N}A_iLen=i=1∑NAi 表示总长度
对于一个 ttt,我们可以 O(N)O(N)O(N) 计算左边燃烧的长度 LlenLlenLlen