Codeforces Round 998 (Div. 3)
A - Fibonacciness#
题意#
长度为
的整数序列,已知 ,填入一个 使得 中的 的个数最多
思路#
总的就
种情况
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
vector<int> v(5);
for (int i = 0; i < 5; i++)
{
if (i == 2)
{
continue;
}
cin >> v[i];
}
int a = v[0] + v[1];
int b = v[4] - v[3];
int c = v[3] - v[1];
int aa = 0, bb = 0, cc = 0;
for (int i = 0; i < 3; i++)
{
v[2] = a;
if (v[i + 2] == v[i + 1] + v[i])
{
aa++;
}
v[2] = b;
if (v[i + 2] == v[i + 1] + v[i])
{
bb++;
}
v[2] = c;
if (v[i + 2] == v[i + 1] + v[i])
{
cc++;
}
}
cout << max(aa, max(bb, cc)) << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
B - Farmer John's Card Game#
题意#
头牛编号从 到 ,每头牛有 张手牌,共 张牌编号从 到 。构造一个长度为 的序列 ,使得手牌打出的顺序从小到大
思路#
当
,则 一定存在(手牌大小升序);其他情况最少有 张牌,记录每张牌属于哪头牛,用 数组存放牛的编号,从小到大遍历手牌,将牛的编号推入 ,直到数组大小为 ,检查前后两部分是否相同,相同就是解,否则无解
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int n, m;
cin >> n >> m;
set<pii> s;
for (int i = 1; i <= n; i++)
{
for (int j = 0; j < m; j++)
{
int x;
cin >> x;
s.insert({ x, i });
}
}
if (m == 1)
{
for (auto& i : s)
{
cout << i.second << " ";
}
cout << endl;
return;
}
vector<int> ans;
for (auto& i : s)
{
ans.push_back(i.second);
if (ans.size() == n * 2)
{
break;
}
}
for (int i = 0; i < n; i++)
{
if (ans[i] != ans[i + n])
{
cout << -1 << endl;
return;
}
}
for (int i = 0; i < n; i++)
{
cout << ans[i] << " ";
}
cout << endl;
return;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
C - Game of Mathletes#
题意#
最初有
个数,初始分数为 。游戏有 个回合,每回合 先删除一个数记作 , 再删除一个数记作 ,若 ,分数加 。 要使分数最小化, 要使分数最大化,两人都以最优方式进行游戏,问最后的得分
思路#
显然最后所求即分数的最大值,因为
不管选什么, 总能选到加分的数字(如果有的话)
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int n, k, ans = 0;
cin >> n >> k;
map<int, int> m;
vector<bool> vis(n, false);
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
m[x]++;
}
for (auto& i : m)
{
auto p = m.lower_bound(k - i.first); // 找匹配的
if (p == m.end() || (*p).first != k - i.first)
{
continue;
}
if (*p == i) // 相等
{
ans += i.second / 2;
i.second = (i.second >> 1 ? 1 : 0);
}
else
{
if (i.second > (*p).second)
{
ans += (*p).second;
i.second -= (*p).second;
(*p).second = 0;
}
else
{
ans += i.second;
(*p).second -= i.second;
i.second = 0;
}
}
}
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
D - Subtract Min Sort#
题意#
给定正整数序列
,执行以下操作任意次:将 、 减去 。判断是否能通过操作使得序列不递减。
思路#
既然要不递减,那靠前的数自然越小越好,所以可以操作就操作,最后不合法就是无解
代码#
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < n - 1; i++)
{
if (a[i] <= a[i + 1])
{
int t = min(a[i], a[i + 1]);
a[i] -= t;
a[i + 1] -= t;
}
}
cout << (is_sorted(a.begin(), a.end()) ? "Yes" : "No") << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
E - Graph Composition#
题意#
给定两个简单无向图
, 有 边, 有 条边。在 中进行两种操作:删边、加边,使得 与 连通性相同。求最小操作数
思路#
对于
中多出来的边(相对于 的连通分量之间)是一定要删的,剩下要加的边就是二者连通分量的数量之差
代码 (参考jiangly)#
点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 5e5 + 5;
struct DSU
{
std::vector<int> f, sz;
DSU() {}
DSU(int n)
{
init(n);
}
void init(int n)
{
f.resize(n);
std::iota(f.begin(), f.end(), 0);
sz.assign(n, 1);
}
int find(int x)
{
while (x != f[x])
{
x = f[x] = f[f[x]];
}
return x;
}
bool same(int x, int y)
{
return find(x) == find(y);
}
bool merge(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
{
return false;
}
sz[x] += sz[y];
f[y] = x;
return true;
}
int size(int x)
{
return sz[find(x)];
}
};
void solve()
{
int n, m1, m2;
cin >> n >> m1 >> m2;
vector<pii> ef(m1);
DSU f(n), g(n);
for (int i = 0; i < m1; i++)
{
int u, v;
cin >> u >> v;
u--, v--;
ef[i] = { u,v };
}
int ans = 0, ccf = n, ccg = n;
for (int i = 0; i < m2; i++)
{
int u, v;
cin >> u >> v;
u--, v--;
ccg -= g.merge(u, v); // g的连通分量
}
for (auto& i : ef)
{
int u = i.first;
int v = i.second;
if (!g.same(u, v))
{
ans++; // 删边
}
else
{
ccf -= f.merge(u, v); // f的连通分量
}
}
cout << ans + ccf - ccg << endl; // 连通分量差值就是要加的边数
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
return 0;
}
比赛链接 https://mirror.codeforces.com/contest/2060
分类:
CodeForces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!