Codeforces Round 494 (Div. 3) 补题AK
A R800 思维
思路
就是取出现次数最大的就是答案代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "YES" << endl
#define cn cout << "NO" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;
int n, x;
umap<int, int> mp;
int ans;
int main() {
cin >> n;
forn(i, 1, n) cin >> x, mp[x]++;
for (auto [i, j] : mp) ans = max(ans, j);
cout << ans;
return 0;
}
B R1300 构造
思路
先把少的先放好,如果插入两端则贡献为1,插入其他部分则贡献为2,如果还要多余的就放在插过的地方就行了我的构造方法是:如果是奇数就在右端插一个,如果是偶数就两端都插(防止中间插满了,所以先在两端插),然后就是插中间直到满足条件,剩下的再都插右边就行了
代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "YES" << endl
#define cn cout << "NO" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;
int a, b, x;
int ans[N];
int ch[2] = {0, 1};
int main() {
memset(ans, -1, sizeof ans);
cin >> a >> b >> x;
if (a > b) swap(a, b), swap(ch[0], ch[1]);
for (int i = 2; i <= 2 * a; i += 2) ans[i] = ch[0];
if (x & 1) x--, b--, ans[500] = ch[1];
else if (x >= 2) x -= 2, b -= 2, ans[1] = ans[500] = ch[1];
for (int i = 3, j = 2; j <= x; i += 2, j += 2) ans[i] = ch[1], b--;
forn(i, 1, b) ans[999 - i] = ch[1];
forn(i, 1, 999) if (ans[i] != -1) cout << ans[i];
return 0;
}
C R1300 前缀和 枚举
思路
就是枚举长度,用前缀和优化到O(N^2)就可以过了代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "YES" << endl
#define cn cout << "NO" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 5e3 + 5;
double n, k;
double a[N], s[N];
double ans;
int main() {
cin >> n >> k;
forn(i, 1, n) cin >> a[i], s[i] = s[i - 1] + a[i];
forn(i, k, n) forn(j, 1, n - i + 1) {
int l = j, r = i + j - 1;
ans = max(ans, (s[r] - s[l - 1]) / (double) i);
}
printf("%.15lf", ans);
return 0;
}
D R1600 贪心
思路

代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "YES" << endl
#define cn cout << "NO" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 2e5 + 5;
ll n, q, x;
struct node {
ll v, cnt;
};
bool cmp(node a, node b) {
return a.v > b.v;
}
umap<ll, ll> mp;
vector<node> v;
int main() {
cin >> n >> q;
forn(i, 1, n) cin >> x, mp[x]++;
for (auto [i, j] : mp) v.push_back({i, j});
sort(v.begin(), v.end(), cmp);
while (q--) {
ll ans = 0;
cin >> x;
for (auto i : v) {
ll cnt = min(i.cnt, x / i.v);
x -= cnt * i.v, ans += cnt;
}
if (x != 0) ans = -1;
cout << ans << endl;
}
return 0;
}
E R2100 贪心 构造 树
思路
先构造一条长度为d的链(如果构造不出来记得特判),然后对每个点dfs,一开始每个点的直径应该是$max(d-i+1,i-1)$如果入度小于k或者深度没到d就一直连点,直到点的数量到达n
代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "YES" << endl
#define cn cout << "NO" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
int n, d, k;
int idx;
vector<pair<int, int>> ans;
void dfs(int de, int u) {
if (de >= d) return;
forn(i, 1, k - 1) {
if (idx == n) return;
int v = ++idx;
ans.push_back({u, v});
if (idx == n) return;
dfs(de + 1, v);
}
}
int main() {
cin >> n >> d >> k;
if (d >= n || (k == 1 && n > 2)) goto no;
forn(i, 1, d) ans.push_back({i, i + 1});
idx = d + 1;
if (idx == n) goto yes;
forn(i, 2, d) forn(j, 1, k - 2) {
int v = ++idx;
ans.push_back({i, v});
if (idx == n) goto yes;
dfs(max(d + 1 - i, i - 1) + 1, v);
if (idx == n) goto yes;
}
if (ans.size() < n - 1) goto no;
else goto yes;
no:
cn;
return 0;
yes:
cy;
for (auto i : ans) cout << i.first << ' ' << i.second << endl;
return 0;
}
F R2200 KMP 思维 枚举
思路

代码
#include <bits/stdc++.h>
using namespace std;
#define umap unordered_map
#define cy cout << "YES" << endl
#define cn cout << "NO" << endl
#define ll long long
#define forn(i, l, r) for (int i = l; i <= r; i++)
#define forn_(i, l, r) for (int i = l; i >= r; i--)
#define debug(a) cout << #a << "=" << a << endl;
const int inf = 0x3f3f3f3f;
const int N = 3e2 + 5;
int n, m;
int sum, cnt, ans;
string str[N];
int s[N], t[N];
umap<string, int> mp;
int ne[N];
void get_next() {
ne[1] = 0;
for (int i = 2, j = 0; i <= m; i++) {
while (j && t[i] != t[j + 1]) j = ne[j];
if (t[i] == t[j + 1]) j++;
ne[i] = j;
}
}
int ok;
bool kmp(int x, int y) {
ok = 0;
for (int i = 1, j = 0; i <= n; i++) {
while (j != 0 && s[i] != t[j + 1]) j = ne[j];
if (s[i] == t[j + 1]) j++;
if (j == m) ok++, j = 0;
}
return ok >= 2;
}
void op(int x, int y) {
m = y - x + 1;
int res = m - 1;
forn(i, x, y) res += str[i].size();
cnt = x;
forn(i, 1, m) t[i] = s[cnt++];
get_next();
if (kmp(x, y)) ans = min(ans, sum - ok * (res - m));
}
int main() {
cin >> n;
forn(i, 1, n) cin >> str[i];
forn(i, 1, n) sum += str[i].size();
sum += n - 1;
ans = sum;
forn(i, 1, n) {
if (mp[str[i]]) continue;
mp[str[i]] = ++cnt;
}
forn(i, 1, n) s[i] = mp[str[i]];
forn(i, 1, n) forn(j, i, n) op(i, j);
cout << ans;
return 0;
}

浙公网安备 33010602011771号