A
暴力检查即可
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200 + 5;
int dig[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
string str;
cin >> str;
reverse(str.begin(), str.end());
int ans = 0, singlecnt = 0, secondcnt = 0;
for (int i = 0; str[i]; ++i) {
if (str[i] == '1') {
dig[i] = 1;
if (i & 1) singlecnt++;
else secondcnt++;
}
}
for (int i = 0; ; i += 2) {
bool flg = false;
for (int j = i; j < 100; ++j) {
if (dig[j]) {
flg = true;
ans++;
break;
}
}
if (!flg) break;
}
if (singlecnt == 0 && secondcnt == 1) ans--;
printf("%d\n", ans);
}
B
审题:只能形成1 2 4 8 2^i这样的序列
最小即用1填充,最大用2^i填充
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;
typedef long long ll;
ll minsum[50], maxsum[50];
int main()
{
for (int i = 1; i <= 20; ++i) {
//minsum[i] = minsum[i - 1] + i;
maxsum[i] = maxsum[i - 1] + (1ll << (i - 1));
//cout << minsum[i] << ", " << maxsum[i] << endl;
}
int n, l, r;
scanf("%d%d%d", &n, &l, &r);
printf("%lld %lld\n", maxsum[l] + n - l, maxsum[r] + 1ll * (n - r) * (1ll << (r - 1)));
}
C
题意为若最短路dis[p1][pi] = dis[p1][p2] + dis[p2][p3] + dis[p3][pj] + … + dis[pj][pi]即可省略中途经过点直接输出p1->pi
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 100 + 5;
const int inf = 0x3f3f3f3f;
char mat[maxn][maxn];
int dis[maxn][maxn];
int a[1000005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n; cin >> n;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
dis[i][j] = inf;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
cin >> mat[i][j];
if (mat[i][j] == '1') dis[i][j] = 1;
}
}
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (dis[i][k] + dis[k][j] < dis[i][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
for (int i = 1; i <= n; ++i) dis[i][i] = inf;
int m; cin >> m;
for (int i = 1; i <= m; ++i) cin >> a[i];
int pos = 1;
vector<int> ans;
ans.push_back(a[1]);
for (int i = 2; i <= m; ++i) {
if (dis[a[pos]][a[i]] != i - pos) {
ans.push_back(a[max(pos + 1, i - 1)]);
pos = i - 1;
}
}
ans.push_back(a[m]);
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); ++i) {
if (i) cout << " " << ans[i];
else cout << ans[i];
}
cout << endl;
}
D
参考博文:https://hexo.mysakure.com/2019/08/D1-Kirk-and-a-Binary-String-easy-version
贪心
`#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2000 + 5;
char str[maxn], ans[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> str;
int cnt = 0, n = strlen(str);
for (int i = n - 1; i >= 0; --i) {
ans[i] = str[i];
if (str[i] == '0') cnt++;
else if (cnt) cnt--;
else ans[i] = '0';
}
ans[n] = '\0';
cout << ans << endl;
}
`