Educational Codeforces Round 116 (Rated for Div. 2)
A. AB Balance
题目大意:
给定一个字符串要求,最后的字符串ab的数量和ba的数量相同,然后输出最后的字符串,要求最小步骤
代码实现:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;
#define int long long
#define endl '\n'
void solve()
{
string s;
cin >> s;
int n = s.size(), resab = 0, resba = 0;
for (int i = 0; i < n - 1; i++) {
if (s[i] == 'a') if (s[i + 1] == 'b') resab++;
if (s[i] == 'b') if (s[i + 1] == 'a') resba++;
}
if (resab == resba) {
cout << s << endl;
return ;
} else {
for (int i = 0; i < n - 1; i++) {
cout << s[i];
}
if (s[n - 1] == 'a') cout << "b\n";
else cout << "a\n";
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
// T = 1;
while (T--) {
solve();
}
return 0;
}
B. Update Files
题目大意:
其实就是首先是2的i - 1次幂,然后判断第一个k大于的地方在哪里,然后看这里的前缀和是否大于我们的n,然后判断哪一位,分类讨论即可
代码实现:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define int long long
#define endl '\n'
int qpow(int a, int b) {
int res = 1;
while(b) {
if (b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
int qpow(int a, int b, int mod) {
int res = 1 % mod;
a %= mod;
while(b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
const int N = 65;
int a[N], s[N], n, k;
void solve() {
cin >> n >> k;
n--;
int pos = -1;
for (int i = 1; i <= 65; i++) {
if (a[i] >= k) {
pos = i - 1;
break;
}
}
if (s[pos] > n) {
for (int i = 1; i <= pos; i++) {
if (s[i] == n) {
cout << i << endl;
} else if (s[i] > n) {
cout << i << endl;
}
}
} else if (s[pos] == n) {
cout << pos << endl;
} else if (s[pos] < n) {
n -= s[pos];
if (n % k == 0) {
cout << pos + n / k << endl;
} else {
cout << pos + n / k + 1 << endl;
}
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
// T = 1;
for (int i = 1; i <= 62; i++) {
a[i] = qpow(2, i - 1);
s[i] += s[i - 1] + a[i];
}
while(T--) {
solve();
}
return 0;
}
C. Banknotes
题目大意:
要求用k个纸币组不成的最大整数,先把k + 1,然后判断两个纸币之间最多加多少,然后计算就可以了,记得开longlong
代码实现;
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define int long long
#define endl '\n'
int qpow(int a, int b) {
int res = 1;
while(b) {
if (b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
int qpow(int a, int b, int mod) {
int res = 1 % mod;
a %= mod;
while(b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int n, k;
void solve() {
cin >> n >> k;
k++;
vector<int> a(n);
for (auto &it : a) cin >> it;
vector<int> b = a;
for (auto &it : b) it = qpow(10, it);
int res = 0;
for (int i = 1; i < n; i++) {
int tmp = (b[i] - b[i - 1]) / b[i - 1];
if (tmp <= k) {
k -= tmp;
res += tmp * b[i - 1];
} else {
res += k * b[i - 1];
k = 0;
break;
}
}
if (k) {
res += k * b[n - 1];
}
cout << res << endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
// T = 1;
while(T--) {
solve();
}
return 0;
}