A:
输出n个o
B:
统计一个数在二进制表示下结尾有几个0,一直将该数右移,什么时候变成奇数就停止
C:
本质上是把一个十进制数转化成五进制数,但是五进制下的0~4分别用0、2、4、6、8代替
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll n;
vector<int> a;
cin >> n;
n--;
if (n == 0) cout << 0, exit(0);
while (n) {
a.push_back(2 * (n % 5));
n /= 5;
}
reverse(a.begin(), a.end());
for (auto v : a) cout << v;
cout << endl;
return 0;
}
知识点:将一个十进制数转化成k进制数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int n, ans = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int num = i;
bool flag = true;
while (num) {
if (num % 8 == 7) {
flag = false;
break;
}
num /= 8;
}
num = i;
while (num) {
if (num % 10 == 7) {
flag = false;
break;
}
num /= 10;
}
if (flag) ans++;
}
cout << ans << endl;
return 0;
}
D:
第一反应是将pyramid序列分成左右两端来处理,表示以第i个数为结尾的能构成的最长pyramid左序列长度,表示以第i个数为结尾的能构成的最长pyramid右序列长度.
初始状态:l[1] = r[n] = 1
转移方程:l[i] = min(l[i - 1] + 1, a[i])
r[i]=min(r[i + 1] + 1, a[i])
ans = max(min(l[i], r[i]))
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n, a[N], ans = 1, Left[N], Right[N];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++) {
Left[i] = min(Left[i - 1] + 1, a[i]);
}
for (int i = n; i >= 1; i--) {
Right[i] = min(Right[i + 1] + 1, a[i]);
}
for (int i = 1; i <= n; i++) {
ans = max(ans, min(Left[i], Right[i]));
}
cout << ans << endl;
return 0;
}