首页 > 其他分享 >「比赛记录」CF Round 954 (Div. 3)

「比赛记录」CF Round 954 (Div. 3)

时间:2024-07-19 19:08:31浏览次数:17  
标签:11 二位数 sum 954 CF int 十位数 Div 个位数

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;
}

标签:11,二位数,sum,954,CF,int,十位数,Div,个位数
From: https://www.cnblogs.com/YuenYouth/p/18265917

相关文章

  • P1954
    对于一个拓扑图,可以建反图。首先考虑连边,从a到b的代表val[a]<val[b]。那么DAG上每条链上的时间都递减。同时因为拓扑的性质,时间的要求是可以保证的。从入度为0的结点开始考虑贪心,让限制紧的人先飞,所以我们可以将队列换成优先队列,这样就可以满足这个性质了,因为题目保证有解。然后想......
  • Codeforces Round 959 sponsored by NEAR (Div. 1 + Div. 2)
    A直接速通就好了,我第一眼看的时候以为是整个数组可以有重复的数字,后面发现是保证没有的,所以直接随便交换一下位置就结束了。B,很经典的CF题,随便推导一下就能够发现,如果我想要一个位置能够发生变化,那么唯一的要求就是他以及他前面的位置有1出现过。而且完全不需要考虑为了一个数字......
  • 【VMware VCF】VMware Cloud Foundation Part 02:部署 Cloud Builder。
    VMwareCloudBuilder是用于构建VMwareCloudFoundation第一个管理域的自动化部署工具,通过将一个预定义信息的Excel参数表导入到CloudBuilder以启动VCF的初始构建过程(Bring-up)。VMwareCloudBuilder通常是以OVA文件的形式与VMwareCloudFoundation一同发行并在......
  • 从强化学习到反事实思考CFL
    1.引言1.1强化学习与CFL概念的引入在人工智能领域,强化学习(ReinforcementLearning,RL)是一种让智能体通过与环境的交互来学习如何做出决策的方法。它的核心在于智能体通过尝试不同的行动并观察其带来的后果(收益或损失),从而学习到最优的行为策略。这种方法在游戏、机器人......
  • CF1139D
    https://www.luogu.com.cn/problem/CF1139D(暂时没有解释,咕咕咕~~~)最重要的部分是对式子的化简,令\(X\)为步数:\[\begin{align}E[X]&=\sum_jjP(X=j)\\&=\sum_j\sum_i^j1P(X=j)\\&=\sum_i\sum_{j\geqi}P(X=j)\\&=\sum_iP(X\geqi)\\&=1+\sum......
  • 题解:CF1381A1 Prefix Flip (Easy Version)
    思路这道题直接用下一题的代码就行了\(C1\):注意到限制\(3n\)很大,于是看每一位是不是一样的,再操作,如样例一:转化第一位:\(01\to11\)。转化第二位:\(11\to00\to10\)。每次把当前位子提到第一位,然后翻转第一位,最后翻转回去,最多\(3n\)次,不用暴力操作直接计答案时间复杂度......
  • P8600&CF526F(双倍经验)
    看P8600题面比较易懂这种问区间的题目,一般都是枚举右端点,找有多少个符合条件的左端点。然后容易发现一个性质,如果一个区间最大数的下标减区间最小数的下标+1等于区间长度,那么这个区间就是一个连号。所以我们可以动态维护\(max(a_{l},...,a_{r})-min(a_{l},...,a_{r})+1=len\)\(m......
  • Educational Codeforces Round 139 (Rated for Div. 2)
    A.ExtremelyRound----------------------------------题解-------------------------------------因为数据范围只有1e6,我们只需要预处理出来1-1e6每个每个数包含多少个极圆整数就行了,然后t次查询就可以。这种预处理查询是面对多次询问时应该首先想到的。点击查看代码#incl......
  • 题解:CF1912D Divisibility Test
    又是一道水绿。刚刚小学毕业的数学idiot——我释怀地笑了。第一种很好判断,当$b^k$为$n$的倍数时,取基数为$b$的能被$n$整除的整数$c$的最后$k$位数显然能被$n$整除。第二种也不难,当$b^k\equiv1\pmodn$时,取以$b$为底数的能被$n$整除的整数$c$的$k$......
  • 【学术会议征稿】第六届信息与计算机前沿技术国际学术会议(ICFTIC 2024)
    第六届信息与计算机前沿技术国际学术会议(ICFTIC2024)20246th InternationalConferenceonFrontierTechnologiesofInformationandComputer   第六届信息与计算机前沿技术国际学术会议(ICFTIC2024)将在中国青岛举行,会期是2024年11月8-10日,为期三天,本次会议是......