Codeforces Round 954 (Div. 3)

题目列表:

  • A. X Axis
  • B. Matrix Stabilization
  • C. Update Queries
  • D. Mathematical Problem
  • E. Beautiful Array
  • F. Non-academic Problem
  • G1. Permutation Problem (Simple Version)
  • G2. Permutation Problem (Hard Version)

A. X Axis

题目大意:

t组测试样例,每组样例给出三个整数,分别表示数轴上三个点的坐标,选取数轴上任意一个点,使得这个点到给定的三个点的距离和最小,求出这个最小距离和。

分析:

纯水题,显然答案就是给定的这三个点中最大的坐标减去最小的坐标。

B.Matrix Stabilization

题目大意:

C. Update Queries

题目大意:

给你两个字符串S、C,长度分别为n和m,以及一个大小为m的数组$ind[]$表示索引,有m次操作,从1到m依次进行,第i次操作需要把 $ S_{ind[i]} $变为$C_i$。并且你可以把字符串$C$以任意顺序排列,比如对于$C=abc$,你可以将它变为$acb,bca,bac,cab,cba$。求出m次操作之后所能得到的字典序下最小的$S$。

D.Mathematical Problem

分析:

\(n\le20\) 这是 \(O(n^2)\) ?NO!

非 DP 整体复杂度 \(O(n)\) 可做!可以当成并不困难的规律题做。

思路分析:

首先我们要想到一些特殊情况(原因在代码注释中解释):

  1. \(n=2\) 时直接输出原数;
  2. \(n=3\) 时,若第一位或第三位数为 0,则答案为 0;
  3. \(n>3\) 时,有 0 则答案为 0。

此题有一个显而易见的性质:对于已知的一组数,除了 0 和 1 之外的数直接加和答案最小。

证明:显然。其他题解中对于这一条已有很好的解释,这里不再多做叙述了,也可以自己手膜一下容易发现。

在想到这条性质后,那么我们需要做的就是分出一个二位数使答案最优,以下我们称要找的这个二位数为最优二位数

按照容易想到的 \(O(n^2)\) 做法,就是遍历出所有二位数,对每一个二位数,都求一遍 1 以为的数的加和,答案即为所有和的最小值。

那么我们能不能直接 \(O(n)\) 找出最优二位数呢,再仔细分析一下,又发现以下性质:

(若两个二位数 \(a,b\),有 \(a\) 优于 \(b\),则我们写成 \(a>b\))于是有如下“优排列”(注意 11,21 等个位数为 1 的数的位置)

$ 12=13=14=15=16=17=18=19>11=22=...=29>21>...$

以此类推。(不含个位数为 0 的, 因为特殊情况中 0 已经考虑)即十位数相同的所有二位数,个位数不为 1 的数要优于个位数为 1 的。

为什么呢?我们假定将原数列除 1 之外的总和为 \(sum\),找出最优二位数之后除 1 之外的总和为 \(you\),最优二位数为 12 时,则 \(you\) 相比于 \(sum\) 增加了 \(12-2=10\),(\(sum\) 中只加了 2 ,而 \(you\) 中加了 12,对于所有十位数为 1 的二位数,\(you-sum\) 的值都为 10,而对于 11 ,\(you-sum=11-0=11\) (因为 1 在 \(sum\) 都不进行计算)。\(11>10\),所以十位数相同时,个位数不为 1 的要优于个位数为 1 的。那么十位数为 2、个位数不为 1 时,\(you-sum=18\),对于 21,\(you-sum=20\),同理,便得出了上述“优排列”。

这样我们就可以 \(O(n)\) 找出最优二位数了,之后直接计算即可。

处理的时候我们可以分别找出最小的各位为 1 的二位数和各位不为 1 的二位数,比较它们十位数即可。

代码如下:

#include<bits/stdc++.h>
using namespace std; const int N = 25; int t, n, a[N]; int main(){
// freopen("in.in", "r", stdin); freopen("out.out", "w", stdout); scanf("%d", &t);
while(t--)
{
scanf("%d", &n); bool if_end = false;
for(int i=1; i<=n; i++){
scanf("%1d", &a[i]);
} if(n == 2){ //n-2=0,即不需要添加运算符,直接输出
int ans = 0;
ans = a[1] * 10 + a[2];
printf("%d\n", ans);
continue;
}
if(n == 3){
if(a[1] == 0 or a[3] == 0){//特判0
puts("0");
continue;
}
if(a[2] == 0){//n=3,只能有一个运算符,第二位数为0答案不为0
if(a[1] == 1) printf("%d\n", a[3]);
else if(a[3] == 1) printf("%d\n", a[1]);
else printf("%d\n", a[1]+a[3]);
continue;
}
} int sm = 2008, id = 0;//记个位数不为1的最小二位数及位置
int _1 = 2008, id_1 = 0;//个位数为1的最小二位数及位置
for(int i=1; i<=n; i++){
if(n > 3 and a[i] == 0){ //有0,全部相乘便为0
puts("0"); if_end = true; break;
} int now = a[i-1] * 10 + a[i];
if(i > 1 and a[i] == 1){
if(_1 > now) _1 = now, id_1 = i;
}
if(i > 1 and a[i] != 1){
if(sm > now) id = i, sm = now;
}
}
if(if_end) continue; int y = sm - sm % 10;//y为个位数不为1的最小二位数的十位数
if(_1 < y and _1) sm = _1, id = id_1;//此时最优二位数为最小的个位数为1的二位数 int ans = sm;
for(int i=1; i<=n; i++){ //1之外的加和
if(i == id or i == id - 1 or a[i] == 1) continue;
ans += a[i];
} printf("%d\n", ans); } return 0;
}

「比赛记录」CF Round 954 (Div. 3)的更多相关文章

  1. 【cf比赛记录】Codeforces Round #601 (Div. 2)

    Codeforces Round #601 (Div. 2) ---- 比赛传送门 周二晚因为身体不适鸽了,补题补题 A // http://codeforces.com/contest/1255/p ...

  2. 【cf比赛记录】Codeforces Round #600 (Div. 2)

    Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...

  3. 【cf比赛记录】Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)

    比赛传送门 只能说当晚状态不佳吧,有点头疼感冒的症状.也跟脑子没转过来有关系,A题最后一步爆搜没能立即想出来,B题搜索没有用好STL,C题也因为前面两题弄崩了心态,最后,果然掉分了. A:简单数学 B ...

  4. 【cf比赛记录】Codeforces Round #605 (Div. 3)

    比赛传送门 Div3真的是暴力杯,比div2还暴力吧(这不是明摆的嘛),所以对我这种一根筋的挺麻烦的,比如A题就自己没转过头来浪费了很久,后来才醒悟过来了.然后这次竟然还上分了...... A题:爆搜 ...

  5. 【cf比赛记录】Codeforces Round #604 (Div. 2)

    比赛传送门 感觉这场是最近以来做过的最顺手的一场,持续上分,开心w A了 前三题,然后第四题其实还有半个多小时,但怕身体撑不住,就先退了,其实第四题也很简单 自己认为的算法标签: ​ A.暴力模拟.字 ...

  6. CF Round #510 (Div. 2)

    前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...

  7. 竞赛题解 - CF Round #524 Div.2

    CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...

  8. CF Round #600 (Div 2) 解题报告(A~E)

    CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...

  9. CF Round #551 (Div. 2) D

    CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...

  10. cf Round#273 Div.2

    题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...

随机推荐

  1. Android 12(S) MultiMedia Learning(三)MediaPlayer Native

    上一篇MediaPlayer中看到实现一个最简单的播放器只需要5个接口,接下来会看看这些接口实现内容 /************************************************ ...

  2. 开源云原生平台对比 KubeSphere vs Rainbond

    最近因为工作需要,需要找一个功能完善的云原生应用平台,经过自己筛选和朋友推荐,剩下 KubeSphere和Rainbond ,这两个产品都是基于 Kubernetes 之上构建的云原生应用平台,功能都 ...

  3. js 表格的添加和删除操作

        大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国 ...

  4. 关于 ajax在前端提示SyntaxError: Unexpected end of JSON input

    前几日,在开发微信公众号上的网页时候,前端采用h5+jquery开发,后端采用ASP.net的ashx接收前端的参数,restful采用的是java开发,由于在ASP.ENT的 webconfig中增 ...

  5. 深入解读Prometheus Adapter:云原生监控的核心组件

    本文详述了Prometheus Adapter的部署与配置,通过三个实践案例展示其在Kubernetes环境中的应用,帮助用户实现基于自定义指标的自动扩展和跨集群统一监控. 关注作者,分享AI全维度知 ...

  6. SpringBoot系列(七) jpa的使用,以增删改查为例

    JPA是Java Persistence API的简称,Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 它是SUN公司推出的一套基 ...

  7. ABC351

    我多久没更新这个系列了啊 E 把格子分成两类,每一类之间的坐标均可互相走到. 然后将这里面的点都旋转 \(45\) 度,于是这个问题就被转换成曼哈顿距离的问题了. 我们可以把 \(x\) 和 \(y\ ...

  8. Vue学习:17.组件通信案例-记事本

    通过上一节的学习,我们了解并掌握了组件通信的定义及一般使用.那么接下来,我们将之前练习过的案例使用组件化思想来实现一下吧. 实例:记事本(组件化) 实现功能 运用组件化思想,实现Vue学习:3.V标签 ...

  9. 使用shell脚本在Linux中管理Java应用程序

    目录 前言 一.目录结构 二.脚本实现 1. 脚本内容 2. 使用说明 2.1 配置脚本 2.2 脚本部署 2.3 操作你的Java应用 总结 前言 在日常开发和运维工作中,管理基于Java的应用程序 ...

  10. python 日志写入文件,参数说明及动态判断文件是创建还是追加

    import logging import os ''' 格式符 含义 %(levername)s 日志级别名称 %(pathname)s 当前执行程序的路径(即脚本所在的位置) %(filename ...