补题链接:Here

1538A. Stone Game

数组 \(a\) 的大小为 \(n\) ,请问每次可以删除最左和最右侧的元素,请问最少执行多少次能删除掉数组中的最大值和最小值 (\(1\le a_i\le n\))


在输入的时候确定最大值和最小值的下标,

4种情况

比较从左边删除和右边删除的情况即可

void solve() {
int n; cin >> n;
int id1, id2;
for (int i = 1, x; i <= n; ++i) {
cin >> x;
if (x == 1)id1 = i;
if (x == n)id2 = i;
}
if (id1 > id2) swap(id1, id2);
int cnt1 = (id1 + min(n - id2 + 1, id2 - id1));
int cnt2 = (n - id2 + 1 + min(id1, id2 - id1));
cout << min(cnt1, cnt2) << "\n";
}
void solve() {
int n; cin >> n;
vector<int>a(n);
for (int &x : a)cin >> x;
int maxPos = max_element(a.begin(), a.end()) - a.begin();
int minPos = min_element(a.begin(), a.end()) - a.begin();
cout << min({
max(maxPos, minPos) + 1,
(n - 1) - min(maxPos, minPos) + 1,
(n - 1) - maxPos + minPos + 2,
(n - 1) - minPos + maxPos + 2
}) << "\n";
}

1538B. Friends and Candies

Polycarp 要对他的 \(n\) 个朋友的蛋糕数量重新分配,使得每个人的蛋糕数量相同。

找到最小的 \(k\) \(a_{i1} + a_{i2}+...+a_{ik}\) 进行分配


数学题,

首先如果总的蛋糕数不是 \(n\) 的倍数,直接输出 \(-1\) ,接下来在统计大于平均值的人数即可

void solve() {
int n; cin >> n;
ll cnt = 0;
vector<int>a(n);
for (int &x : a)cin >> x, cnt += x;
if (cnt % n != 0) {cout << -1 << "\n"; return ;}
int c = 0;
cnt /= n;
for (int i = 0; i < n; ++i) {
if (a[i] > cnt)c++;
}
cout << c << "\n";
}

1538C. Number of Pairs

在数组 \(a\) 中寻找最大对数的 \((i,j) (1\le i < j \le n)\) 使得 \(l \le a_i + a_j \le r\)


简单来说要统计两种情况

  • \(a_i + a_j \le r\)
  • \(a_i + a_j \le l - 1\)

二分上面两种情况,然后相减就是合适的区间长度了。

但要注意如果本身 \(a_i * 2\) 就符合情况的话会重复计算一次,要减去一

最后输出 \(ans / 2\)

双指针写法

void solve() {
int n; ll L, R;
cin >> n >> L >> R;
vector<ll>a(n + 1);
for (int i = 1; i <= n; ++i)cin >> a[i];
sort(a.begin() + 1, a.end());
int l = 2, r = n;
ll cnt = 0;
while (l <= n and a[1] + a[1] <= L)l++;
for (int i = 1; i <= n; ++i) {
while (l > 1 and a[l - 1] + a[i] >= L)l--;
while (r > i and a[r] + a[i] > R)r--;
if (r >= max(l, i)) {
if (l > i)cnt += (r - l + 1);
else cnt += r - i;
}
}
cout << cnt << '\n';
}

二分写法

void solve() {
int n, l, r ;
cin >> n >> l >> r;
vector<int>a(n);
for (int &x : a)cin >> x;
sort(a.begin(), a.end());
ll ans = 0;
for (int i = 0; i < n; ++i) {
ans += upper_bound(a.begin(), a.end(), r - a[i]) - a.begin();
ans -= lower_bound(a.begin(), a.end(), l - a[i]) - a.begin();
if (2 * a[i] >= l && a[i] * 2 <= r)ans--;
}
cout << ans / 2 << "\n";
}

1538D. Another Problem About Dividing Numbers

给与 \(a\) 和 \(b\) 两个整数,在一回合操作里,

  • \(a\) 和 \(b\) 两个整数都要找出 \(c\ (a\ 或\ b\ \% c ==0)\)

请问是否能在 \(k\) 个回合结束后使得 \(a=b\)


看样例想到是质因数个数的问题,

但试了下先欧拉素数筛晒出 \(1e9\) 的数据还是 TLE了(常数太大了),然后尝试直接统计因子个数,注意使用 scanf 而不是 cin

void solve() {
int a, b, k;
scanf("%d%d%d", &a, &b, &k);
if (k == 1) {
puts(a != b && (a % b == 0 || b % a == 0) ? "YES" : "NO");
return ;
}
int cnt = 0;
for (int i = 2; i * i <= b; ++i) {
while (b % i == 0) {
b /= i; cnt++;
}
}
if (b != 1)cnt++;
for (int i = 2; i * i <= a; ++i) {
while (a % i == 0) {
a /= i;
cnt++;
}
}
if (a != 1)cnt++;
puts(cnt >= k ? "YES" : "NO");
}

1538E. Funny Substrings

没看懂题意,以后补

1538F. Interesting Function

這道題比賽沒寫出來虧了一個億

给定两个整数 \(l\) 和 \(r\),其中 \(l<r\)。 我们将向 \(l\) 加 1,直到结果等于 \(r\)。 因此,将执行 \(r-l\) 次加法。 对于每个这样的加法,让我们看看在它之后将更改的位数。


累加不同位数的情况下 \(r - l\) ,直到 \(l = 0\) 和 \(r= 0\)

void solve() {
ll l, r;
cin >> l >> r;
ll ans = 0;
while (l != 0 || r != 0) {
ans += (r - l);
l /= 10, r /= 10;
}
cout << ans << "\n";
}

如果这算数位DP, 那么算是我见过最简单的数位DP了.

ll dp[20];
void init(int n) {
dp[1] = 1;
for (int i = 2; i <= n; ++i)dp[i] = dp[i - 1] * 10 + 1;
}
int cnt(ll x) {
int a[20] = {0}, Cnt = 0;
while (x) {
a[Cnt++] = x % 10;
x /= 10;
}
ll ans = 0;
for (int i = Cnt - 1; i >= 0; --i)ans += dp[i + 1] * a[i];
return ans;
}
void solve() {
ll l, r;
cin >> l >> r;
cout << cnt(r) - cnt(l) << "\n";
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
init(15);
int _; for (cin >> _; _--;) solve();
return 0;
}

1538G. Gift Set

Polycarp 有 x 个红色糖果和 y 个蓝色糖果。 使用它们,他想制作礼品套装。 每个礼品套装包含一个红色糖果和 b 个蓝色糖果,或一个蓝色糖果和 b 个红色糖果。 任何糖果最多只能属于一个礼品套装。

帮助 Polycarp 找到他可以创造的最大数量的礼品套装。

例如,如果 \(x=10,y=12,a=5,b=2\),那么 Polycarp 可以制作三套礼物:

  • 第一套有 5 个红色糖果和 2 个蓝色糖果;
  • 第二组将有 5 个蓝色糖果和 2 个红色糖果;
  • 第三组将有 5 个蓝色糖果和 2 个红色糖果。

思路来自 Arctic_Clam

考虑二分可分的集合的数量。

如何 \(O(1)\) 求给定的某个集合可行与否?

不妨设 \(x < y,a < b\)

记 \(n\) 为要验证的集合数量,\(s\) 为第 一种集合数量,\(t\)为 第二种集合数量。

于是我们有

\[\left\{
\begin{array}{**lr**}
as+bt\le x\\
bs + at\le y
\\s + t=n
\end{array}
\right.
\]

变形可以得到

\[\left\{
\begin{array}{**lr**}
s \ge \frac{x - nb}{a -b}\\
s \le \frac{y - na}{b - a}
\end{array}
\right.
\]

也就是说,给定n,我们可以求出s的取值区间。再判定下该区间是否合法即可。

\(eg:\) \(s\) 取值区间的左界应该是向下取整,但是 \(x−nb\) 和 \(a − b\) 都是负数,而 C++默认是趋零取整,所以要特判。

ll x, y, a, b;
bool check(ll n) {
ll l = (x - n * b) / (a - b);
if ((x - n * b) < 0 and (-(x - n * b)) % (b - a) != 0)l++;
ll r = (y - n * a) / (b - a);
return l <= r and r >= 0 and l <= n;
}
void solve() {
cin >> x >> y >> a >> b;
if (x > y) swap(x, y);
if (a > b) swap(a, b);
if (a == b) {
cout << (x /= a) << "\n";
return ;
}
ll l = 0, r = x;
while (l < r) {
if (l == r - 1) {
if (check(r)) l = r;
break;
}
ll mid = (l + r) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << l << '\n';
}

似乎本题也可以三分做,dalao也对三分做了正确性证明(tql

二分的正确性是显然的,但是三分的正确性并不那么显然。

为了证明三分的正确性,我们需要证明集合总数n是第一集合数s的函数,且该函数至多有一个峰。

下面给出证明:

Codeforces Round #725 (Div. 3) A~G 题解记录的更多相关文章

  1. 刷题记录:Codeforces Round #725 (Div. 3)

    Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...

  2. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  3. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  4. Codeforces Round #672 (Div. 2) A - C1题解

    [Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...

  5. Codeforces Round #579 (Div. 3) 套题 题解

    A. Circle of Students      题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...

  6. Codeforces Round #725 (Div. 3) A-D,F题解

    A. Stone Game 思路:总共3种情况,都从最左端被拿走,都从最右端被拿走,左侧的从最左端被拿走且右侧的从最右端被拿走,取最小值即可 代码: //CF-725.A #include<bi ...

  7. Educational Codeforces Round 46 (Div 2) (A~G)

    目录 Codeforces 1000 A.Codehorses T-shirts B.Light It Up C.Covered Points Count(差分) D.Yet Another Prob ...

  8. Codeforces Round #614 (Div. 2) A-E简要题解

    链接:https://codeforces.com/contest/1293 A. ConneR and the A.R.C. Markland-N 题意:略 思路:上下枚举1000次扫一遍,比较一下 ...

  9. Codeforces Round #610 (Div. 2) A-E简要题解

    contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...

  10. Codeforces Round #611 (Div. 3) A-F简要题解

    contest链接:https://codeforces.com/contest/1283 A. Minutes Before the New Year 题意:给一个当前时间,输出离第二天差多少分钟 ...

随机推荐

  1. Android 输入系统介绍

    目录 一.目的 二.环境 三.相关概念 3.1 输入设备 3.2 UEVENT机制 3.3 JNI 3.4 EPOLL机制 3.5 INotify 四.详细设计 4.1 结构图 4.2 代码结构 4. ...

  2. WPF 入门基础

    关于 WPF 和 XAML 什么是 WPF WPF(Windows Presentation Foundation)是由微软开发的桌面应用程序框架,用于创建现代化.高度交互和具有视觉吸引力的用户界面. ...

  3. MongoDB中的分布式集群架构

    MongoDB 中的分布式集群架构 前言 Replica Set 副本集模式 副本集写和读的特性 Sharding 分片模式 分片的优势 MongoDB 分片的组件 分片键 chunk 是什么 分片的 ...

  4. IIS下使用SSL证书

    IIS下使用SSL证书 本文介绍windowsServer下SSL证书配置及IIS站点配置 1.    生成SSL证书 在阿里云申请免费SSL证书 登录阿里云管理控制台,打开SSL证书管理 选择免费证 ...

  5. 华企盾DSC客户端服务无法启动一直处于启动停止状态

    该问题有两种情况: 1.客户端安装有问题,5097目录缺少文件,解决方法见下面详细信息 2.客户端本地数据库出现问题,需要卸载客户端以及删除对应的本地数据库备份文件(解决方法见下面详细信息) 3.由于 ...

  6. 自定义开发odoo14的统计在线用户人数

    在 Odoo 14 中统计在线人数通常涉及到定制开发或者使用特定的模块. 自定义开发:如果没有现成的模块,您可能需要进行一些自定义开发.这通常涉及到扩展Odoo的用户模型,以跟踪用户的登录和登出活动. ...

  7. Intellij IDE 对接SVN

    1.安装SVN(SVN安装包见附件) 注意安装时需要选择第二个选项进行安装 2.安装SVN中文包(见附件) 安装完成后随便找个文件夹右键确认SVN安装是否生效 3.Intellij IDE得Setti ...

  8. 解决C#连接MySQL数据库报错 MySqlConnector

    如果主机不支持 SSL 连接,则不会使用 SSL 连接. 连接不上. 解决方案:在连接字符串后添加 sslmode = none. <add key="connstring" ...

  9. 大四jsp实训项目技术总结

    crm项目总结 ①静态资源疯狂报错?很有可能是后端的问题,后端出了问题,服务器取不出来资源. 记住:只要服务器取不到某个资源,很有可能导致所有资源都取不出来. 一个经典案例:某个数据库映射文件 ICu ...

  10. 我的大数据之路 - 基于HANA构建实时方案的历程

    产品内部前期有一个共识,依据业务要求的时效性来选择技术平台,即: 实时类业务,时效性小于2小时,则使用HANA构建. 离线类业务,时效性大于2小时,则使用大数据平台构建. 经过五月.六月两月的努力,离 ...