Codeforces Round #527 (Div. 3)
A. Uniform String
Intuition
尽可能平均。
Solution
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
const int INF = 0x7fffffff;
const double eps = 1e-8;
int main(int argc, const char *argv[])
{
// freopen("input.in", "r", stdin);
int T;
cin >> T;
int n, k;
while (T--) {
cin >> n >> k;
string part = "";
for (int i = 0; i < k; i++) {
part += (char)('a' + i);
}
string res = "";
for (int i = 0; i < n / k; i++) {
res += part;
}
for (int i = 0; i < n % k; i++) {
res += (char)('a' + i);
}
cout << res << endl;
}
return 0;
}
B. Teams Forming
Intuition
排序。
Solution
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
const int INF = 0x7fffffff;
const double eps = 1e-8;
int a[105];
int main(int argc, const char *argv[])
{
// freopen("input.in", "r", stdin);
int n;
cin >> n;
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, a+n);
int res = 0;
for (int i = 1; i < n; i += 2) {
res += a[i] - a[i - 1];
}
cout << res << endl;
return 0;
}
C. Prefixes and Suffixes
Intuition
给定一堆前缀和后缀,找到最长的两个,然后分别为前缀和后缀的两种情况。
Solution
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
const int INF = 0x7fffffff;
const double eps = 1e-8;
int n;
string s[205], backup[205];
string ori;
char res[205];
bool isp(string x) {
for (int i = 0; i < x.length(); i++) {
if (x[i] != ori[i]) return false;
}
return true;
}
bool iss(string x) {
int len = x.length();
for (int i = len - 1; i >= 0; i--) {
if (x[i] != ori[n - len + i]) return false;
}
return true;
}
bool check() {
for (int i = 0; i < 2 * n - 2; i += 2) {
if (!(isp(s[i]) && iss(s[i + 1]) || isp(s[i + 1]) && iss(s[i]))) return false;
}
return true;
}
void print() {
vector<int> vis(2 * n, 0);
for (int i = 0; i < 2 * n - 2; i++) {
if (isp(backup[i]) && !iss(backup[i])) res[i] = 'P';
else if (iss(backup[i]) && !isp(backup[i])) res[i] = 'S';
else if (iss(backup[i]) && isp(backup[i])) {
if (!vis[backup[i].length()]) {
res[i] = 'P';
vis[backup[i].length()] = 1;
} else res[i] = 'S';
}
}
res[2 * n - 2] = '\0';
printf("%s\n", res);
}
int main(int argc, const char *argv[])
{
// freopen("input.in", "r", stdin);
cin >> n;
for (int i = 0; i < 2 * n - 2; i++) {
cin >> s[i];
backup[i] = s[i];
}
sort(s, s + 2 * n - 2,
[](const string a, const string b) -> bool {
return a.length() < b.length();
});
// for (int i = 0; i < 2 * n - 2; i++) {
// cout << s[i] << " " << backup[i] << endl;
// }
ori = s[2 * n - 3][0] + s[2 * n - 4];
if (check()) {
print();
} else {
ori = s[2 * n - 4][0] + s[2 * n - 3];
print();
}
return 0;
}
Last updated