Week8 CSP-M2

2023-05-16

T1 HRZ的序列

题目

相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列aa,他对这个序列产生了浓厚的兴趣。
他好奇是否存在一个数KK,使得一些数加上KK,一些数减去KK,一些数不变,使得整个序列中所有的数相等。
其中对于序列中的每个位置上的数字,至多只能执行一次加运算或减运算或是对该位置不进行任何操作。
由于瑞神只会刷B站,所以他把这个问题交给了你!

样例输入输出

输入格式
输入第一行是一个正整数tt表示数据组数。
接下来对于每组数据,输入的第一个正整数nn表示序列aa的长度,随后一行有nn个整数,表示序列aa。
输出格式
输出共包含tt行,每组数据输出一行。对于每组数据,如果存在这样的K,输出"YES",否则输出“NO”。(输出不包含引号)
样例输入
2
5
1 2 3 4 5
5
1 2 3 4 5
样例输出
NO
NO

解析

序列中只可能有三个数,只可能是排序后的最小值、最大值和最小最大值的平均值。我们在将序列排序后,序列中的最小值一定是第一个,最大值一定是最后一个。如果序列中有且最多有三个数,那么第三个数一定是第一和最后一个数的平均值。找到这三个数字后,我们遍历序列,只要有不满足的就返回no。否则为yes。

代码

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

long long a[10005];

int main(){
	int t;
	cin >> t;
	for(int i = 0 ; i < t ; i++)
	{
		int n;
		cin >> n;
		for(int j = 0 ; j < n ; j++)
			cin >> a[j];
		sort(a, a + n);
		long long mid;
		mid = (a[0] + a[n - 1]) / 2;
		int flag = 0;
		for(int j = 0 ; j < n ; j++)
		{
			if(flag == 1)
				break;		
			if(a[j] != a[0] && a[j] != a[n - 1] && a[j] != mid)
			{
				cout << "NO" << endl;
				flag = 1;
			}
			else
				continue;
		}
		if(flag == 0)
			cout << "YES" << endl;
	}
} 

回顾

这道题其实很简单,只要想明白它只能有三个数就行。易错点数的范围要用long long,刚开始我也没发现,在做第三题时发现第三题数据范围达到10的18次方需要开long long时刻意回来检查才发现的。

T2 HRZ学英语

题目

瑞神今年大三了,他在寒假学会了英文的26个字母,所以他很兴奋!
于是他让他的朋友TT考考他,TT想到了一个考瑞神的好问题:给定一个字符串,从里面寻找 连续的26个大写字母 并输出!
但是转念一想,这样太便宜瑞神了,所以他加大了难度:现在给定一个字符串,字符串中包括26个大写字母和特殊字符’?’,特殊字符’?'可以代表任何一个大写字母。
现在TT问你是否存在一个 位置连续的且由26个大写字母组成的子串 ,在这个子串中每个字母出现且仅出现一次,如果存在,请输出从左侧算起的第一个出现的符合要求的子串,并且要求,如果有多组解同时符合位置最靠左,则输出字典序最小的那个解!如果不存在,输出-1!
这下HRZ蒙圈了,他刚学会26个字母,这对他来说太难了,所以他来求助你,请你帮他解决这个问题,报酬是可以帮你打守望先锋。
说明:字典序 先按照第一个字母,以 A、B、C……Z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,SIGH 和 SIGHT),那么把短者排在前。例如
AB??EFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABDCEFGHIJKLMNOPQRSTUVWXYZ
上面两种填法,都可以构成26个字母,但是我们要求字典序最小,只能取前者。
注意,题目要求的是 第一个出现的, 字典序最小的

样例输入输出

输入格式
输入只有一行,一个符合题目描述的字符串。
输出格式
输出只有一行,如果存在这样的子串,请输出,否则输出-1
样例输入1
ABC??FGHIJK???OPQR?TUVWXY?
样例输出1
ABCDEFGHIJKLMNOPQRSTUVWXYZ
样例输入2
AABCDEFGHIJKLMNOPQRSTUVW??M
样例输出2
-1

解析

用一个数组str [26] 去标记26个字母是否都存在,从第一个字母开始遍历,记录出现的字母,当遇到重复的字母时停止本次遍历,然后继续从下一个字母开始遍历,直到出现26位字母不重复(但是可以包含“?”)。之后按要求按字典序将“ ?”替换成需要的字母即可。

代码

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstring>
using namespace std;

char a[1000005];
int str[27]; // 对应26个字母串 
int tag;

int main(){
    cin >> a;
    int flag = 0;
    int n = strlen(a);
    for(int i = 0 ; i < n - 25 ; i++)
    {
        memset(str, 0, sizeof(str));
        flag = 0;
        for(int j = i ; j < i + 26 ; j++)
        {
            if(a[j] == '?')
				continue;
            else
            {
                if(str[a[j] - 'A'] == 1)
                {
                    flag = 1;
                    break;
                }
                else
                	str[a[j] - 'A'] = 1;
            }
        }
        if(flag == 0)
        {
            for(int j = i ; j < 26 + i ; j++)
            {
                if(a[j] == '?')
                {
                    for(char k = 'A' ; k <= 'Z' ; k++)
                    {
                        if(str[k - 'A'] == 0)
                        {
                            str[k - 'A'] = 1;
                            a[j] = k;
                            break;
                        }
                    }
                }
            }
            tag = i;
            break;
        }
        
    }
    if(flag == 0)
    {
    	for(int j = tag ; j < 26 + tag ; j++)
    		cout << a[j];
    	cout << endl;
    	return 0;
	}
    else 
		cout << "-1" << endl;
}

回顾

这道题很简单,想清楚遍历的方式,就能很快的写出来。利用每次只遍历26个字母,不满足则返回的方式可以让这题写起来很简单,省略掉一些刚开始考虑的判断条件。

T3 咕咕东的奇妙序列

题目

咕咕东 正在上可怕的复变函数,但对于稳拿A Plus的 咕咕东 来说,她早已不再听课。
此时她在睡梦中突然想到了一个奇怪的无限序列:112123123412345…
这个序列由连续正整数组成的若干部分构成,其中第一部分包含1至1之间的所有数字,第二部分包含1至2之间的所有数字,第三部分包含1至3之间的所有数字,第i部分总是包含1至i之间的所有数字。
所以,这个序列的前56项会是11212312341234512345612345671234567812345678912345678910,其中第1项是1,第3项是2,第20项是5,第38项是2,第56项是0。
咕咕东 现在想知道第 k 项数字是多少!但是她睡醒之后发现老师讲的东西已经听不懂了,因此她把这个任务交给了你。

样例输入输出

输入格式
输入由多行组成。
第一行一个整数q表示有q组询问(1<=q<=500)(1<=q<=500)
接下来第i+1行表示第i个输入k_i,表示询问第k_i
项数字。(1<=k_i<=10^{18})(1<=k i​<=10 ^18 )
输出格式
输出包含q行
第i行输出对询问k_ik i的输出结果。
样例输入
5
1
3
20
38
56
样例输出
1
2
5
2
0

解析

先说一下思路(刚开始不是这么做的,因为原来的做法有问题就重构了,这个放在回顾里谈):
这题很容易想明白,它的问题就在于如何妥善的处理当递增序列10位或者100位以上后,每个数字占多位的情况。
同样的,这道题要采用一种类似前缀和的思想。
我们把这个数列按每组递增分成一块一块,1,12,123,…
在第1到第9块,每相邻的两块之间数字个数相差1;
第10块到第99块,每相邻的两块之间数字个数相差2;
第10i块到10i+1-1块,每相邻的两块之间数字个数相差i + 1。
有了这个规律,我们就可以根据数字的位置来知道它的值了。
找位置,当然要用二分的方法。通过两次二分,一次用来查找它在第几块,一次用来查找它在块中的位置,就能找出它的值。

代码

#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9;
long long ans[1000000] = {0};

long long getsum(long long x) {return x * (x + 1) >> 1;}

long long getsum1(long long x){
	long long ans = 0, i = 1, j = 1;
	for ( ; j * 10 <= x ; i++, j *= 10 )
		ans += i * getsum(j * 9) + i * j * 9 * (x - j * 10 + 1);
	return ans + i * getsum(x - j + 1);
}

long long getsum2(long long x){
	long long ans = 0, i = 1, j = 1;
	for ( ; j * 10 <= x ; i++, j *= 10)
		ans += i * j * 9;
	return ans + i * (x - j + 1);
}

int main(){
	int q;
	cin >> q;
	
	while(q--)
	{
		long long k;
		cin >> k;
		
		long long l = 0, r = 1e9;
		long long mid = 0;
		long long a = 0; 
		while(l < r - 1)
		{
			mid = (l + r) >> 1;
			if(getsum1(mid) < k)
			{
				l = mid;	
				a = mid;	
			}
			else
			{
				r = mid;	
			}
		}
		k -= getsum1(a);
	
		
		long long ll = 0, rr = a + 1;	
		long long b = 0;
		while(ll < rr - 1)
		{
			mid = (ll + rr) >> 1;
			if(getsum2(mid) >= k)
			{
				rr = mid;	
			}
			else
			{
				ll = mid;
				b = mid;
			}
		}
		k -= getsum2(b);
		b++;
		
		int i = 0;
		for( ; b > 0 ; b = b / 10)
		{
			ans[i] = b % 10;
			i++;
		}
		
		cout << ans[i - k] << endl;
	}
} 

回顾

这道题刚刚拿到,我一看序列操作,又是多次求值,根据前一晚上复习的内容,前缀和就开始写了。但是当时每太理清楚这些数字的关系,到交卷前都没有写完,就把题目里56个数字输进去造了一个常量数组,骗了30分,总共230还可以接受。
之后补题的时候,因为太久忘了原来的思路就干脆重写了(其实是骗分的时候忘了保存写了一半的代码)…然后提交的时候在第7个点WA掉了,看数据范围应该是k到1018的那几组数据也就是需要long long的地方出了问题。我跟同学讨论了一下,同学告诉我尽量不要用数组去操作long long的数据,数据太大了很容易出错。想起来这道题是某巨卡网站上的,就去搜了一下大佬们的思路,后来看到二分这个优美的思路,就根据他的思路重构了代码。以后要注意尽量避免long long型数据的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Week8 CSP-M2 的相关文章

  • csp-m4

    反思 此次模测做的不太理想 xff0c t1因为一个循环条件写错导致只拿到了3个点的分数 xff0c t2是读题不仔细没有搞清输出的数据同时对于数据范围估计也产生了错误 xff0c 导致爆0 xff0c t4看到树就犯怵的习惯还有待克服 x
  • week16——实验(csp_m4)

    目录 TT数鸭子 xff1a 问题描述题目简述输入 输出格式样例 问题分析解题思路参考代码 心得体会 ZJM要抵御宇宙射线 xff1a 问题描述题目简述输入 输出格式样例 问题分析解题思路参考代码 心得体会 宇宙狗的危机 xff1a 问题描
  • CSP-M3

    文章目录 T1 瑞神的序列题目描述 xff1a 输入描述 xff1a 输出描述 xff1a 样例输入 xff1a 样例输出 xff1a 数据组成 xff1a 题目分析 xff1a 代码 xff1a T2 消消乐大师 Q老师题目描述 xff1
  • CSP CCF: 202012-2 期末预测之最佳阈值 (C++)

    目录 题目来源题目描述解题过程完整代码 题目来源 链接 CCF 期末预测之最佳阈值 题目描述 解题过程 题目要求为选取合适的安全指数阈值 Theta xff0c 使得该阈值对这 m 位同学上学期的挂科情况进行预测 xff0c 预测正确的次数
  • CCF-CSP考试介绍以及复习技巧指导

    CCF CSP考试时间及费用 时间一般是每年3 9 12月的中旬 xff0c 报名时间一般也是提前一个月 xff0c 不固定 非计算机协会会员300元 次 xff0c 会员180元 次 xff08 学生会员需缴纳50元 年的会费 xff09
  • 【ZJM要抵御宇宙射线】CSP模测T2

    题目 题目大意 本题给出平面二维坐标上的若干个点 xff0c 要求选取一个点做圆心 xff0c 此时可以以最短半径包含所有点 xff0c 求出圆心坐标和最短半径平方 xff0c 结果保留两位小数 解题思路 本题乍看只下可能觉得会很复杂 xf
  • 【Week 16】CSP-M4

    TT数鸭子 题目描述 输入输出描述 样例 思路 对每个数字按数位进行遍历 xff0c 求取不重复数字个数即可 代码 span class token macro property span class token directive key
  • CSP-M3 B

    思路 xff1a 定义两个矩阵 xff0c 一个矩阵记录输入的数据 xff0c 另一个矩阵起标记作用 xff0c 当以行的方式遍历矩阵 xff0c 如果大于等于3个数字相同 xff0c 则标记为0 同理 xff0c 以竖的方式进行遍历 最后
  • CCF CSP 2019-12-1 “报数” 解题思路及满分代码(C++11)

    文章目录 题目描述解题思路满分代码 题目描述 解题思路 题目比较简单 xff0c 需要搞清楚两个点 xff1a 跳过的数是7的倍数或含7的数 xff0c 即取余为0或各个位上有7的数n代表的是总共的报数个数 xff0c 跳过的数是不算的 下
  • CSP考试 2016年04月第3题 路径解析 C++实现

    表示本目录 xff0c 例如 d1 f1 指定的就是 d1 f1 如果有多个连续的 出现 xff0c 其效果等同于一个 绝对路径 xff1a 以 符号开头 xff0c 表示从根目录开始构建的路径 相对路径 xff1a 不以 符号开头 xff
  • 针对CSP-T1,T2的练习

    文章目录 题目1问题描述样例输入样例输出 解题思路代码 题目2问题描述样例输入样例输出 解题思路代码 题目1 问题描述 给出n个数 xff0c zjm想找出出现至少 n 43 1 2次的数 xff0c 现在需要你帮忙找出这个数是多少 xff
  • csp模拟2-T1 HRZ的序列

    题目 时间限制 1s 空间限制 64MB 题目描述 相较于咕咕东 xff0c 瑞神是个起早贪黑的好孩子 xff0c 今天早上瑞神起得很早 xff0c 刷B站时看到了一个序列aaa xff0c 他对这个序列产生了浓厚的兴趣 他好奇是否存在一个
  • CCF CSP 201512-3 画图

    字符串基础题 问题描述 用 ASCII 字符来画图是一件有趣的事情 xff0c 并形成了一门被称为 ASCII Art 的艺术 例如 xff0c 下图是用 ASCII 字符画出来的 CSPRO 字样 lt 本题要求编程实现一个用 ASCII
  • CSP-S 模拟测试57题解

    人生第一次A B层一块考rank2 xff0c 虽然说分差没几分 xff0c 但还是值得纪念 题解 xff1a T1 天空龙 xff1a 大神题 xff0c 因为我从不写快读也没有写考场注释的习惯 xff0c 所以不会做 xff0c 全hz
  • CSP 202305-1 重复局面

    题目背景 国际象棋在对局时 同一局面连续或间断出现3次或3次以上 可由任意一方提出和棋 问题描述 国际象棋每一个局面可以用大小为 8 8 的字符数组来表示 其中每一位对应棋盘上的一个格子 六种棋子王 后 车 象 马 兵分别用字母 k q r
  • 数据结构--二叉树

    前言 关于二叉树知识的考察主要分两部分 第一部分在初赛中体现 一般考察二叉树的节点个数 树高和遍历问题 1 二叉树定义 在计算机科学中 二叉树是每个结点最多有两个子树的树结构 通常子树被称作 左子树 left subtree 和 右子树 r
  • CCF-CSP真题《202303-1 田地丈量》思路+python,c++,java满分题解

    想查看其他题的真题及题解的同学可以前往查看 CCF CSP真题附题解大全 试题编号 202303 1 试题名称 田地丈量 时间限制 1 0s 内存限制 512 0MB 问题描述 问题描述 西西艾弗岛上散落着 n 块田地 每块田地可视为平面直
  • CCF-CSP真题《202305-1 重复局面》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看 CCF CSP真题附题解大全 试题编号 202305 1 试题名称 重复局面 时间限制 1 0s 内存限制 512 0MB 问题描述 题目背景 国际象棋在对局时 同一局面连续或间断出现3次或3次以
  • CSP 202209-1 如此编码

    答题 题目就是字多 include
  • 数据结构--二叉堆与优先队列

    堆的一些性质 1 堆是一颗完全二叉树 2 堆的顶端一定是 最大 最小 的 但是要注意一个点 这里的大和小并不是传统意义下的大和小 它是相对于优先级而言的 3 堆一般有两种样子 小根堆和大根堆 分别对应第二个性质中的 堆顶最大 堆顶最小 对于

随机推荐

  • Linux-用shell脚本写一个进度条

    shell执行脚本 xff1a 创建一个 sh文件 xff0c 编辑文件即可执行脚本 Shell脚本中用 表示注释 xff0c 相当于c语言的 注释 但如果 位于第一行开头 xff0c 并且是则例外 xff0c 它表示该脚本使用后面指定的解
  • S3C2440裸机按键控制小灯

    1 环境 1 操作系统 xff1a win7 64位 2 集成开发环境 xff1a keil4 7 3 开发板 xff1a FL2440 4 下载器 xff1a Jlink V9 2 按键以及LED灯原理图 根据FL2440开发板原理图可知
  • 数组存邻接表

    模板 xff1a 数组表示邻接表 int top 61 0 向 点中存第top个边 int head MAX N 61 1 每个点在建立邻接表时 xff0c 栈顶的边的编号 边的结构体 struct Edge int v 另一端连接的点 i
  • windows远程桌面到Ubuntu

    环境 xff1a VMware 43 Ubuntu18 04 方案 xff1a xrdp 43 gnome ubuntu xff08 不要安装xubuntu xff0c 费力不讨好 xff09 自己分步安装有时会遇到配置困难 xff0c 建
  • 系列一、NotePad++离线安装NppFTP插件

    一 下载离线插件 链接 xff1a https pan baidu com s 16EEGYOTKkMP bB8LcnwpsQ pwd 61 yyds 提取码 xff1a yyds 二 解压自己NotePad 43 43 对应版本 xff0
  • Ubuntu18 AMD和ARM版本的源的区别

    Ubuntu18 AMD和ARM版本的源的区别 文章目录 Ubuntu18 AMD和ARM版本的源的区别AMD版本ARM版本主要区别 之前因为懒没有仔细研究ubuntu AMD和ARM版本系统apt源的区别 xff0c 导致今天换源时候走了
  • 【C51】基于C51单片机的定时闹钟(含代码,电路,拿走即可用)

    基于C51单片机的定时闹钟 上电后设置定时时间 xff0c 按键1选择设置的是小时分钟还是秒钟 按键2对其进行具体的数字设置 一次选择完成之后就默认进入计时模式 达到计时时间后响铃 按键3可以关闭响铃 代码 span class token
  • 解决Centos7.9图形界面root用户登录报“sorry, that didn‘t work please try again”问题

    一 问题描述 xff1a 新装的Centos7 9 在图形界面以root身份进行登录时报 sorry that didn t work please try again xff0c 如下图所示 xff1a 经确认 xff0c root密码是
  • ubuntu 安装QT 5.0出现错误:Failed to load platform plugin "xcb".

    当你安装QT 5 0 时 xff0c 启动的时候会出现如下错误 xff1a Failed to load platform plugin 34 xcb 34 Available platforms are linuxfb minimal x
  • 获取Android设备的序列号(SN号)

    方法 xff08 一 xff09 通过反射获取sn号 public static String getDeviceSN String serial 61 null try Class lt gt c 61 Class forName 34
  • Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较

    一 邮件发送流程 邮件的发送是主动行为 xff1a 主要通过 MUA 邮件客户端软件 xff0c 将邮件内容发送给对应的服务器 暂存到投递服务区 xff0c 然后由当前运营商根据邮件特征信息将邮件转发给目标服务器的投递服 务区 xff0c
  • mysql limit 使用规范

    在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql 已经为我们提供了上面这样一个功能 xff08 0 xff09 mysql不支持select
  • 【Proteus仿真】【STM32单片机】智能电饭煲系统设计

    文章目录 一 功能简介二 软件设计三 实验现象联系作者 一 功能简介 本项目使用Proteus8仿真STM32单片机控制器 xff0c 使用继电器加热 保温模块 数码管模块 按键模块 LED指示灯 蜂鸣器模块等 主要功能 xff1a 系统运
  • Kurento-6.7.1 媒体服务器搭建详细教程(Kurento-Media-Server)

    Kurento 6 7 1 媒体服务器搭建详细教程 关于 Kurento 媒体服务器 Kurento 架构的核心是媒体服务器 xff0c 它被命名为Kurento媒体服务器 xff0c 即 KMS Kurento 媒体服务器所有的媒体处理模
  • 什么是jsp?

    什么是JSP JSP全称Java Server Pages xff0c 是一种动态网页开发技术 它使用JSP标签在HTML网页中插入Java代码 标签通常以 lt 开头以 gt 结束 JSP是一种Java servlet xff0c 主要用
  • Echarts实现自定义图标——风向图

    上图用了两种模式表示风向图 xff0c 第一种是自定义系列 xff0c 第二种使用了折线图 xff0c 给折线图添加自定义图标 两者的区别在于给options series设置不同的type值 xff0c 如下图 xff1a 那么我们来一步
  • 最大公约数的四种方法

    最大公约数的四种方法 前言1 暴力穷举法2 辗转相除法步骤原理证明 xff1a 3 更相减损法步骤原理证明 xff1a 比较 4 stein算法比较原理步骤 前言 求两数的最大公约数 xff0c 一共有四种方法 xff1a 暴力穷举法 更相
  • Codeblocks配合gfortran作为fortran开发环境的配置方法

    xff08 以前在bmy bbs发过一次 xff09 这个方法试过在64位win7和32位winxp上可用 1 xff0c 首先安装codeblockes xff0c 必须选完全安装 xff08 Full All plugins xff09
  • Mysql jdbc URL连接参数useSSL、serverTimezone 相关问题

    MySQL 8 0 以下版本 JDBC 驱动名及数据库 URL span class token keyword static span span class token keyword final span span class toke
  • Week8 CSP-M2

    T1 HRZ的序列 题目 相较于咕咕东 xff0c 瑞神是个起早贪黑的好孩子 xff0c 今天早上瑞神起得很早 xff0c 刷B站时看到了一个序列aa xff0c 他对这个序列产生了浓厚的兴趣 他好奇是否存在一个数KK xff0c 使得一些