Codeforces Round 921 (Div. 2) A-C
文章目录
A.We Got Everything Covered!
模拟+找规律
构造一个 n*k 长度的字符串,将字符串分成n份,每一份长度为k
每一份必须有前k个字母
例如k=3,n=3
只需要构造:abc,重复三遍即可
abc abc abc
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
const int maxn = 0x7fffffff;
const ll MAX_INT = 1e18;
void slove(int x) {//枚举a菜
}
int main() {
int t;
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
string s;
for (int i = 0; i < k; i++) {
s += 'a' + i;
}
string b;
for (int i = 1; i <= n; i++) {
b += s;
}
cout << b<<endl;
}
}
B. A Balanced Problemset?
模拟+数学
设,最大公约数为x
那么将x分为n份方案,每份方案必然是x或x的倍数
枚举x的因数i,x/i
开始打擂台, ans=max(ans,符合条件的因数)
如果 i*n < x 那么记录答案
如果 (x/i)*n < x 也记录答案
输出答案即可
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
const int maxn = 0x7fffffff;
const ll MAX_INT = 1e18;
int main() {
int t;
cin >> t;
int cnt = 0;
while (t--) {
cnt++;
ll x, n;
cin >> x >> n;
int end = x / n;
ll ans = 0;
for (ll i = 1; i *i<=x; i++) {
if (x % i == 0 ) {
if (i * n <= x) {
ans = max(ans, i);
}
if (x / i * n <= x) {
ans = max(ans, x / i);
}
}
}
cout << ans << endl;
}
}
C. Did We Get Everything Covered?
找规律,模拟
由第一题可知,给定的m必须是大于或等于n*k
并且,每一份要包含前k种字符串。
所以,我们可以从1~m扫一遍,记录有多少份合格的单元(包含前k种字符)
如果合格的单元少于n,那么这个字符串一定是不合格的。
例如:
abc bbc aac
合格的单元:abc、bbca
(只需要满前k个字符)
不合格的单元:ac
所以这串字符缺少的子串:ccb
(合格的单元的最后一个字符+不合格单元缺少的字符)
(这个规律很难找,需要自己多写一些长的样例)
#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;
const int maxn = 0x7fffffff;
const ll MAX_INT = 1e18;
void slove(int x) {//枚举a菜
}
int main() {
int t;
cin >> t;
int bnt = 0;
while (t--) {
bnt++;
int n, k, m;
string s;
cin >> n >> k >> m >> s;
map<char, int> mmp;
int flag = 0;//分块,每一块长度为k,共n块,如果里面满k块,记作1
string pre;
for (int i = 0; i < m; i++) {
mmp[s[i]]++;
if (mmp.size() == k) {
flag++;
mmp.clear();
pre += s[i];
}
}
if (flag < n) {
cout << "NO" << endl;
cout << pre;
char nxt;
for (int i = 0; i < k; i++) {
if (mmp['a' + i] == 0) {
nxt = 'a' + i;
break;
}
}
int len = n-pre.size();
for (int i = 0; i < len; i++)cout << nxt;
cout << endl;
}
else {
cout << "YES"<<endl;
}
}
}
i++) {
if (mmp[‘a’ + i] == 0) {
nxt = ‘a’ + i;
break;
}
}
int len = n-pre.size();
for (int i = 0; i < len; i++)cout << nxt;
cout << endl;
}
else {
cout << "YES"<<endl;
}
}
}