「比赛记录」CF Round 954 (Div. 3)
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)\) 可做!可以当成并不困难的规律题做。
思路分析:
首先我们要想到一些特殊情况(原因在代码注释中解释):
- \(n=2\) 时直接输出原数;
- \(n=3\) 时,若第一位或第三位数为 0,则答案为 0;
- \(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)的更多相关文章
- 【cf比赛记录】Codeforces Round #601 (Div. 2)
Codeforces Round #601 (Div. 2) ---- 比赛传送门 周二晚因为身体不适鸽了,补题补题 A // http://codeforces.com/contest/1255/p ...
- 【cf比赛记录】Codeforces Round #600 (Div. 2)
Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...
- 【cf比赛记录】Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
比赛传送门 只能说当晚状态不佳吧,有点头疼感冒的症状.也跟脑子没转过来有关系,A题最后一步爆搜没能立即想出来,B题搜索没有用好STL,C题也因为前面两题弄崩了心态,最后,果然掉分了. A:简单数学 B ...
- 【cf比赛记录】Codeforces Round #605 (Div. 3)
比赛传送门 Div3真的是暴力杯,比div2还暴力吧(这不是明摆的嘛),所以对我这种一根筋的挺麻烦的,比如A题就自己没转过头来浪费了很久,后来才醒悟过来了.然后这次竟然还上分了...... A题:爆搜 ...
- 【cf比赛记录】Codeforces Round #604 (Div. 2)
比赛传送门 感觉这场是最近以来做过的最顺手的一场,持续上分,开心w A了 前三题,然后第四题其实还有半个多小时,但怕身体撑不住,就先退了,其实第四题也很简单 自己认为的算法标签: A.暴力模拟.字 ...
- CF Round #510 (Div. 2)
前言:没想到那么快就打了第二场,题目难度比CF Round #509 (Div. 2)这场要难些,不过我依旧菜,这场更是被\(D\)题卡了,最后\(C\)题都来不及敲了..最后才\(A\)了\(3\) ...
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- CF Round #600 (Div 2) 解题报告(A~E)
CF Round #600 (Div 2) 解题报告(A~E) A:Single Push 采用差分的思想,让\(b-a=c\),然后观察\(c\)序列是不是一个满足要求的序列 #include< ...
- CF Round #551 (Div. 2) D
CF Round #551 (Div. 2) D 链接 https://codeforces.com/contest/1153/problem/D 思路 不考虑赋值和贪心,考虑排名. 设\(dp_i\ ...
- cf Round#273 Div.2
题目链接,点击一下 Round#273 Div.2 ================== problem A Initial Bet ================== 很简单,打了两三场的cf第一 ...
随机推荐
- PHP 有哪些常用的魔术变量 ?
引言 PHP 向它运行的任何脚本提供了大量的预定义常量. 魔术变量 __LINE__ 文件中的当前行号. __FILE__ 文件的完整路径和文件名. 如果用在被包含文件中,则返回被包含的文件名. __ ...
- 【阿里天池云-龙珠计划】薄书的机器学习笔记——K近邻(k-nearest neighbors)初探Task02
[阿里天池云-龙珠计划]薄书的机器学习笔记--K近邻(k-nearest neighbors)初探Task02 [给各位看官请安] 大家一起来集齐七龙珠召唤神龙吧!!! 学习地址:AI训练营机器学习- ...
- 关于《Java并发编程之线程池十八问》的补充内容
一.写在开头 在上一篇文章我们写<Java并发编程之线程池十八问>的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充. 二.Runnable v ...
- 微软官方开源免费的Blazor UI组件库 - Fluent UI Blazor
前言 今天大姚给大家分享一个由微软官方开源(MIT License).免费的Blazor UI组件库:Fluent UI Blazor. 全面的ASP.NET Core Blazor简介和快速入门 F ...
- MySQL学习笔记-数据定义语言
SQL-数据定义语言(DDL) 一.操作数据库 1.查询 # 查询所有数据库 show databases; # 查询当前数据库 select database(); 2.创建 create data ...
- react跨组件通信
在react没有类似vue中的事件总线来解决这个问题,一是我们借助它们共同的父级组件通过代理的方式来实现,但过程会相当繁锁.react提供了Context来实现跨组件通信, 而不必显式地通过组件树的逐 ...
- 使用 JavaScript 脚本来进行复杂的查询改写
有这么一个需求: 网关里怎样对跨集群搜索进行支持的呢?我想实现: 输入的搜索请求是 lp:9200/index1/_search 这个索引在 3 个集群上,需要跨集群检索,也就是网关能否改成 lp:9 ...
- C# ML.NET 使用GPU遇到 Failed to get convolution algorithm.This is probably because cuDNN failed to initialize
C# ML.NET 使用GPU遇到 Failed to get convolution algorithm.This is probably because cuDNN failed to initi ...
- FlashDuty Changelog 2023-12-18 | 值班管理、服务日历、自定义操作和邮件集成
FlashDuty:一站式告警响应平台,前往此地址免费体验! 值班管理 UI 交互优化 [个人日程]从头像下拉菜单调整到值班列表页面,快速查看个人值班日程 [值班列表]支持原地预览最近一周值班情况,包 ...
- cdn静态资源加速
阿里云cdn产品 https://www.aliyun.com/product/cdn CDN通过广泛的网络节点分布,提供快速.稳定.安全.可编程的全球内容分发加速服务,支持将网站.音视频.下载等内容 ...