Codeforces Round 903 (Div. 3)A~F

A.Don't Try to Count

输入样例:

12
1 5
a
aaaaa
5 5
eforc
force
2 5
ab
ababa
3 5
aba
ababa
4 3
babb
bbb
5 1
aaaaa
a
4 2
aabb
ba
2 8
bk
kbkbkbkb
12 2
fjdgmujlcont
tf
2 2
aa
aa
3 5
abb
babba
1 19
m
mmmmmmmmmmmmmmmmmmm

输出样例:

3
1
2
-1
1
0
1
3
1
0
2
5

思路:签到题,但要注意当字符串a的长度大于2倍的b长度还没有子串b时,说明a中不可能出现子串b,要退出循环。 

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
   int t;cin>>t;
   while(t--)
   {
    int n,m;cin>>n>>m;
    string a,b;cin>>a>>b;
    int cnt=0,f=0;
    while(a.find(b)==string::npos)
    {
        a+=a;
        cnt++;
        if(a.size()>2*m&&a.find(b)==string::npos)
        {
            cout<<-1<<endl;
            f=1;
            break;
        }
    }
    if(!f)
    cout<<cnt<<endl;
   }
}

B. Three Threadlets 

输入样例:

15
1 3 2
5 5 5
6 36 12
7 8 7
6 3 3
4 4 12
12 6 8
1000000000 1000000000 1000000000
3 7 1
9 9 1
9 3 6
2 8 2
5 3 10
8 4 8
2 8 4

输出样例:

YES
YES
NO
NO
YES
YES
NO
YES
NO
NO
YES
YES
NO
YES
NO

思路:找规律,通过模拟样例可以发现三根线要一样长,那么最终长度肯定是要与最短的那根线一样长,如果某根线不能剪成最短长度,说明这根线不能被最短的长度整除,直接输出NO就可以了,如果能被整除,那么比较这两根线的长度和/最短长度得到的结果是否会大于3,大于就输出NO,反之YES。

代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int t;cin>>t;
    while(t--)
    {
        vector<int> v(3);
        int f=0,cnt=0;
        for(auto &it:v) cin>>it;
        sort(v.begin(),v.end());
        f=(v[1]%v[0]||v[2]%v[0]);
        if(f) puts("NO");
        else
        {
            cnt=v[1]/v[0]-1+(v[2]/v[0]-1);
            if(cnt<=3) puts("YES");
            else puts("NO");
        }
    
    }
}

C. Perfect Square

输入样例:

5
4
abba
bcbb
bccb
abba
2
ab
ba
6
codefo
rcesco
deforc
escode
forces
codefo
4
baaa
abba
baba
baab
4
bbaa
abba
aaba
abba

输出样例:

1
2
181
5
9

思路: 因为题目要求矩阵翻转90°之后仍保持不变,说明矩阵的每一条边上的字母都得一样,所以我们可以通过从上往下的每一行的边与另外三条边上对应的元素进行比较(总共只需要遍历n/2行),因为只能将字母变大,所以我们要找到这四条边中最大的字母是哪个,然后另外三个字母就变成这个最大字母maxd,变化次数为4*maxd-(a1+a2+a3),然后我们要记得将原位置更小的字母改成更大的字母,具体可看代码。

代码:

#include<iostream>
using namespace std;
const int N=1e3+5;
char a[N][N];
int main()
{
    int t;cin>>t;
    while(t--)
    {
        int n,sum=0;cin>>n;
        for(int i=1;i<=n;i++) 
            for(int j=1;j<=n;j++) cin>>a[i][j];
                for(int i=1;i<=n/2;i++)
                    for(int j=1+i-1;j<=n-i;j++)
                    {
                        int a1=a[i][j]-'a'; //cout<<a1<<' ';
                        int a2=a[n-j+1][i]-'a'; //cout<<a2<<' ';
                        int a3=a[n-i+1][n-j+1]-'a';// cout<<a3<<' ';
                        int a4=a[j][n-i+1]-'a'; //cout<<a4<<' ';
                        int maxd=max(a1,max(a2,a3));
                        maxd=max(maxd,a4);
                        sum+=4*maxd-(a1+a2+a3+a4);
                        if(a1!=maxd)
                        a[i][j]+=maxd-a1;
                        if(a2!=maxd)
                        a[n-j+1][i]+=maxd-a2;
                        if(a3!=maxd)
                        a[n-i+1][n-j+1]+=maxd-a3;
                        if(a4!=maxd)
                        a[j][n-i+1]+=maxd-a4;
                       // cout<<maxd<<' '<<sum<<' '<<a1+a2+a3+a4<<endl;
                      // cout<<maxd<<' '<<a[4][2]<<endl;
                       //puts("");
                    }
                    cout<<sum<<endl;
    }
}

D. Divide and Equalize

输入样例:

7
5
100 2 50 10 1
3
1 1 1
4
8 2 4 2
4
30 50 27 20
2
75 40
2
4 4
3
2 3 1

输出样例:

YES
YES
NO
YES
NO
YES
NO

思路: 这道题一开始没什么思路,后面看了一些大佬的题解才恍然大悟(heheh( ̄▽ ̄)"终归还是我太菜了),首先我们要知道每个大于1的数都可以分解成几个质因数的乘积,那么这道题的操作是一个数除k的同时另一个数乘k,因数的个数是不会变的,我们可以将其看成因数的转移,所以这n个数中每个质因数的个数如果为n的整数倍则可以将他们变成一样的数,否则不能。

代码:

#include<iostream>
#include<map>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    int t;cin>>t;
    while(t--)
    {
       int n;cin>>n;
       map<int,int> h;
       for(int i=0;i<n;i++)
       {
        int x;cin>>x;
        for(int m=2;m<=x/m;m++)
        {
            while(x%m==0)
            {
                h[m]++;
                x/=m;
            }
        }
        if(x>1) h[x]++;
       }
       int f=0;
      for(auto it:h)
      {
        if(it.second%n!=0)
        {
            f=1;
            break;
        }
      }
      if(f) puts("NO");
      else puts("YES");
    }
}

E. Block Sequence

输入样例:

7
7
3 3 4 5 2 6 1
4
5 6 3 2
6
3 4 1 6 7 7
3
1 4 3
5
1 2 3 4 5
5
1 2 3 1 2
5
4 5 5 1 5

输出样例:

0
4
1
1
2
1
0

思路: 这道题我们要从后往前dp,定义dp[i]为从n到i的最少操作次数,由题意可知我们对一个数字有两种操作,删除:dp[i]=dp[i+1]+1,保留 :dp[i]=dp[i+a[i]+1],我们只需要在这两种操作中取最小值就可以了。

代码:

#include<iostream>
#include<cstring>
using namespace std;
const int N=2e5+5;
int a[N],dp[N];
/*逆向dp*/
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
   int t;cin>>t;
   while(t--)
   {
    int n;cin>>n;
    memset(dp,0,sizeof dp);
    for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=n;i>=1;i--)
        {
            dp[i]=dp[i+1]+1;//删除
            if(i+a[i]<=n) dp[i]=min(dp[i],dp[i+a[i]+1]);//比较保留和删除两种操作
        }
        cout<<dp[1]<<endl;
   }
}

F. Minimum Maximum Distance

输入样例1:

6
7 3
2 6 7
1 2
1 3
2 4
2 5
3 6
3 7
4 4
1 2 3 4
1 2
2 3
3 4
5 1
1
1 2
1 3
1 4
1 5
5 2
4 5
1 2
2 3
1 4
4 5
10 8
1 2 3 4 5 8 9 10
2 10
10 5
5 3
3 1
1 7
7 4
4 9
8 9
6 1
10 9
1 2 4 5 6 7 8 9 10
1 3
3 9
9 4
4 10
10 6
6 7
7 2
2 5
5 8

输出样例1:

2
2
0
1
4
5

输入样例2:

3
6 1
3
1 2
1 3
3 4
3 5
2 6
5 3
1 2 5
1 2
1 3
2 4
3 5
7 1
2
3 2
2 6
6 1
5 6
7 6
4 5

输出样例2:

0
2
0

思路: fi的最小值只会出现在两个或多个标记顶点中间的点到标记顶点的最大距离,找两个标记顶点的最大距离相当于找树的直径(传送门),结果输出(树的直径-1)/2+1。

代码:

/*树的直径————两次dfs

第一次dfs算出所有结点到根节点的距离,到根节点最大距离的那个结点就是树的直径的一个端点
 
第二次dfs以端点为根节点,算出其他点到直径端点的距离,然后取距离最大的那个点即为直径的另一个端点
 
第二次dfs求到的到端点的最大距离即为树的直径*/

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N=2e5+5;
int depth[N],mark[N];
vector<int> edge[N];
void dfs(int u,int fa)
{
    for(auto t:edge[u])
    {
        if(t==fa) continue;
         depth[t]=depth[u]+1;
        dfs(t,u);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t;cin>>t;

    while(t--)
    {
        int n,k;cin>>n>>k; 
        for(int i=1;i<=n;i++) edge[i].clear();
        //vector<int> edge[n];
        for(int i=1;i<=k;i++) cin>>mark[i];
        for(int i=1;i<n;i++) 
        {
           int a,b;cin>>a>>b;
           edge[a].emplace_back(b),edge[b].emplace_back(a);
        }
        depth[1]=0;
        if(k==1)
        {
            cout<<0<<endl;
            continue;
        }
        dfs(1,-1);
        int c=mark[1];
        for(int i=2;i<=k;i++) 
        if(depth[mark[i]]>depth[c]) c=mark[i];//先求直径的一个端点
        depth[c]=0;
        dfs(c,-1);//从这个被标记的端点出发找另一个端点
        c=mark[1];
        for(int i=2;i<=k;i++)
        if(depth[mark[i]]>depth[c]) c=mark[i];
        cout<<(depth[c]-1)/2+1<<endl;
    }
}

(将近半个月没写cf了,A题都让我TLE了一发,暑假得刷起来了😂,话说学校暑假放得真晚,还在复习期末考试科目( ̄▽ ̄)"。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/778305.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

django之url路径

方式一&#xff1a;path 语法&#xff1a;<<转换器类型:自定义>> 作用&#xff1a;若转换器类型匹配到对应类型的数据&#xff0c;则将数据按照关键字传参的方式传递给视图函数 类型&#xff1a; str: 匹配除了”/“之外的非空字符串。 /test/zvxint: 匹配0或任何…

【IO】文件操作

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 文件1.1 认识文件1.2 分清操作的是内存还是硬盘1.3 路径1.3.1 目录结构1.3.2 相对和绝对路径 1.4 文本文件…

计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)

在许多情况下&#xff0c;我们希望把以太网的覆盖范围扩展。本节先讨论在物理层把以太网扩展&#xff0c;然后讨论在数据链路层把以太网扩展。这种扩展的以太网在网络层看来仍然是一个网络。 在物理层扩展以太网 现在&#xff0c;扩展主机和集线器之间的距离的一种简单方法就是…

Spring源码十四:Spring生命周期

上一篇我们在Spring源码十三&#xff1a;非懒加载单例Bean中看到了Spring会在refresh方法中去调用我们的finishBeanFactoryInitialization方法去实例化&#xff0c;所有非懒加载器单例的bean。并实例化后的实例放到单例缓存中。到此我们refresh方法已经接近尾声。 Spring的生命…

【前端实现】在父组件中调用公共子组件:注意事项逻辑示例 + 将后端数组数据格式转换为前端对象数组形式 + 增加和删除行

【前端】在父组件中调用公共子组件的实现方法 写在最前面一、调用公共子组件子组件CommonRow.vue父组件ParentComponent.vue 二、实现功能1. 将后端数组数据格式转换为前端对象数组形式2. 增加和删除row 三、小结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2…

【论文解读】AGENTLESS:揭开基于LLM的软件工程代理的神秘面纱,重塑软件工程自动化新基线

&#x1f4dc; 文献卡 英文题目: Agentless: Demystifying LLM-based Software Engineering Agents;作者: Chunqiu Steven Xia; Yinlin Deng; Soren Dunn; Lingming ZhangDOI: 10.48550/arXiv.2407.01489摘要翻译: 大型语言模型&#xff08;LLM&#xff09;的最新进展显著推进…

nginx(三)—从Nginx配置熟悉Nginx功能

一、 Nginx配置文件结构 ... #全局块events { #events块... }http #http块 {... #http全局块server #server块{ ... #server全局块location [PATTERN] #location块{...}location [PATTERN] {...}}server{...}... #http全局块 …

智慧矿山建设规划方案(121页Word)

智慧矿山建设项目方案摘要 一、项目背景及现状分析 项目背景 随着信息技术的迅猛发展&#xff0c;智慧化、数字化已成为矿山行业转型升级的必然趋势。智慧矿山建设项目旨在通过集成先进的信息技术手段&#xff0c;实现对矿山生产、管理、安全等全过程的智能化监控与管理&…

Python统计实战:时间序列分析之一元线性回归预测和指数曲线预测

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 &#xff08;以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。&#xff09; 练习题 下表是某只股票…

大数的排列组合公式C代码

我们知道&#xff0c;计算排列A(n,m)和组合C(n,m)可以用先求阶乘的方式实现&#xff0c;但是当数很大时求阶乘很容易溢出&#xff0c;所以这里给出非阶乘的方式求排列组合 求排列 分母和分子可以抵消&#xff0c;最后代码如下 unsigned long long A(int n, int m) {unsigned…

代码随想录-Day49

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 …

进程控制-fork函数

一个进程&#xff0c;包括代码、数据和分配给进程的资源。 fork &#xff08;&#xff09;函数通过系统调用创建一个与原来进程几乎完全相同的进程&#xff0c;也就是两个进程可以做完全相同的事&#xff0c;但如果初始参数或者传入的变量不同&#xff0c;两个进程也可以做不同…

第十六章 Qt的文件处理操作详解

目录 一、基本文件操作 二、二进制文件读写 三、文本文件读写 四、操作例子 1、QTextStream的流操作符 一、基本文件操作 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。在所有的 I/O 设备中,文件 I/O 是最重要的部分之…

InfluxDB时序数据库基本使用介绍

1、概要介绍 1.1、时序数据库使用场景 所谓时序数据库就是按照一定规则的时间序列进行数据读写操作的数据库。它们常被用于以下业务场景&#xff1a; 物联网IOT场景&#xff1a;可用于IOT设备的指标、状态监控数据存取。IT建设场景&#xff1a;可用于服务器、虚拟机、容器的…

linux下的网络编程

网络编程 1. 网络基础编程知识1.1网络字节序问题1.2 常用socket编程接口1.2.1 sockaddr1.2.2 ip地址转换函数1.2.4 socket()1.2.3 bind()1.2.4 listen()1.2.5 accept()1.2.6 connect() 1.3 以udp为基础的客户端连接服务器的demo1.4 以udp为基础的的服务器聊天室功能demo1.5 基于…

解决vscode配置C++编译带有中文名称报错问题

在新电脑上安装vscode运行带有中文路径和中文名称的C代码时遇到报错 根据别人的教程将laugh.json文件中"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",改成了"program": "${fileDirname}\\output\\test.exe",&#x…

聊天广场(Vue+WebSocket+SpringBoot)

由于心血来潮想要做个聊天室项目 &#xff0c;但是仔细找了一下相关教程&#xff0c;却发现这么多的WebSocket教程里面&#xff0c;很多都没有介绍详细&#xff0c;代码都有所残缺&#xff0c;所以这次带来一个比较完整得使用WebSocket的项目。 目录 一、效果展示 二、准备工…

大数据中的常见数据问题:独断脏

想象你刚刚入职一家声称正在进行"数字化转型"的大型企业,担任大数据开发工程师。在入职的第一周,你满怀热情,迫不及待地想要大展拳脚,用你的技能来推动公司的数据驱动决策。 目录 大数据中的常见数据问题1. 独 - 数据孤岛2. 断 - 数据价值链断层3. 缺 - 标准、治理…

并口、串口和GPIO口区别

并口 并行接口,简称并口。并口采用的是25针D形接头。所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错,目前,并行接口主要作为打印机端口等。 并口的工作模式 …

ctfshow web 36d 练手赛

不知所措.jpg 没啥用然后测试了网站可以使用php伪达到目的 ?filephp://filter/convert.base64-encode/resourcetest/../index.<?php error_reporting(0); $file$_GET[file]; $file$file.php; echo $file."<br />"; if(preg_match(/test/is,$file)){inclu…