补题链接: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. netty整合websocket(完美教程)

    websocket的介绍: WebSocket是一种在网络通信中的协议,它是独立于HTTP协议的.该协议基于TCP/IP协议,可以提供双向通讯并保有状态.这意味着客户端和服务器可以进行实时响应,并且这 ...

  2. mysql alter与update的区别

    alter是更改表名,字段的 而updata是更改数据的,一定要记住要联合where使用,否则就会全部更改. updata与set联用 alter与change column和add联用

  3. 将mysql的输出文本写回mysql

    1 准备工作 1.1 环境准备 操作系统:Microsoft Windows 10 专业工作站版 软件版本:Python 3.9.6 第三方包: pip install pandas2.1.0 pip ...

  4. C# 字节数组、各进制字符串数据互转

    前言 日常开发过程中,格式转换是必不可少的重要环节,经常是十进制转十六进制.十六进制转byte数组又转换回来来回转换,最然进制转换很基础同时 C# 也提供了很多直接方便进行格式转换的方法,但是封装一个 ...

  5. 基于.NET Core + Quartz.NET+ Vue + IView开箱即用的定时任务UI

    前言 定时任务调度应该是平时业务开发中比较常见的需求,比如说微信文章定时发布.定时更新某一个业务状态.定时删除一些冗余数据等等.今天给大家推荐一个基于.NET Core + Quartz.NET + ...

  6. 模拟QQ登陆

    public class QQLogin { public static void main(String[] args) { int id1 = 123456; String pwd1 = &quo ...

  7. ElasticSearch之线程池

    ElasticSearch节点可用的CPU核的数量,通常可以交给ElasticSearch来自行检测和判定,另外可以在``elasticsearch.yml`中显式指定.样例如下: node.proc ...

  8. JVM优化:如何进行JVM调优,JVM调优参数有哪些

    Java虚拟机(JVM)是Java应用运行的核心环境.JVM的性能优化对于提高应用性能.减少资源消耗和提升系统稳定性至关重要.本文将深入探讨JVM的调优方法和相关参数,以帮助开发者和系统管理员有效地优 ...

  9. PythonAnywhere 部署Flask项目

    一. 注册账号 官网:https://www.pythonanywhere.com/ 二. 将GitHub上的项目发送至PythonAnywhere 三.配置环境及运行 git clone https ...

  10. Python 潮流周刊第 35 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...