CSP M2(A - HRZ 的序列)(B - HRZ 学英语)(C - 咕咕东的奇妙序列)

2023-05-16

CSP M2

  • A - HRZ 的序列
    • 题意
    • 思路
    • 代码
  • B - HRZ 学英语
    • 题意
    • 思路
    • 代码
  • C - 咕咕东的奇妙序列
    • 题意
    • 思路
    • 代码

A - HRZ 的序列

题意

思路

我们先求有多少个不同的数,记为cnt,然后分情况进行处理。

  • cnt > 3:这个时候是不可能实现题目要求的,直接NO
  • cnt < 3:有cnt = 1或2两种可能,1肯定为YES,2可以调整一个数,所以也为YES。
  • cnt = 3:先计算三个数俩俩的差值的绝对值,如果其中有两个数相等则YES,否则NO。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#define llong long long
#define For(i,a,n) for(register int i=a;i<=n;i++)
#define RF(i,a,n) for(register int i=a;i>=n;i--)
#pragma GCC optimize(2)
using namespace std;
const llong inf = 1e15+5;
const int maxn = 10005;

llong t, n, cnt;
llong arr[maxn];
llong num[10];

int main(){
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--){
        cnt = 0;
        cin>>n;
        For(i,1,n){
            cin>>arr[i];
            if(i==1) num[++cnt] = arr[i];
            else{
                For(j,1,cnt){
                    if(num[j]==arr[i])
                        break;
                    if(j==cnt){
                        num[++cnt] = arr[i];
                        break;
                    }
                }
            }
        }
        if(cnt>3){
            cout<<"NO"<<endl;
            continue;
        }
        if(cnt<3){
            cout<<"YES"<<endl;
            continue;
        }
        int t1 = abs(num[2]-num[1]);
        int t2 = abs(num[3]-num[2]);
        int t3 = abs(num[1]-num[3]);
        if(t1==t2 || t1==t3 || t2==t3)
            cout<<"YES"<<endl;
        else 
            cout<<"NO"<<endl;

    }
    return 0;
}

B - HRZ 学英语

题意

思路

这题用了尺取的方法,在从左到右遍历的时候记录一个b数组来表示 l~r 中是否存在这个字母,然后记录一个cnt表示已存在多少不同的字母。
尺取的过程注意 l 和 r 的处理,不要先++再处理 像我一样

首先 r 一直向右遍历,遇到没访问过的字母或者问号就 进行一番处理 ,然后继续向右遍历,遇到访问过的字母则开始处理左边界 l ,l 向右遍历到与 r 当前所处的字母相同的字母(也要进行一番处理),然后停止 l,开始 r (套娃

直到cnt=26就可以停止了,最后输出时候,如果是 ? 则从头到尾遍历b数组并输出第一个未访问的就是字典序了。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#define llong long long
#define For(i,a,n) for(register llong i=a;i<=n;i++)
#define RF(i,a,n) for(register int i=a;i>=n;i--)
#pragma GCC optimize(2)
using namespace std;

const int maxn = 100005;

string str;
int b[30];
llong cnt, bg, flag;

int main(){
    ios::sync_with_stdio(false);
    cin>>str;
    llong len = str.length();
    llong l = 0, r = 0;
    while(r!=len){
    	if(str[r] == '?'){
    		cnt++; r++;
    	}
    	else{
	    	int i = str[r++] - 'A';
	    	if(!b[i]){
	    		b[i] = 1;
	    		cnt++;
	    	}
	    	else{
	    		int j = str[l++]-'A';
	    		while(j!=i){
	    			if(str[l-1]!='?')
	    				b[j] = 0;
	    			cnt--;
	    			j = str[l++]-'A';
	    		}
	    	}
	    }
    	if(cnt==26){
    		bg = r-26;
    		flag = 1;
    		break;
    	}
    }
    if(!flag){
    	cout<<-1<<endl;
    	return 0;
    }
    For(i,bg,bg+25){
    	if(str[i]=='?'){
    		For(j,0,25){
    			if(!b[j]){
    				b[j] = 1;
    				cout<<char(j+'A');
    				break;
    			}
    		}
    	}
    	else
    		cout<<str[i];
    }
    cout<<endl;
    return 0;
}

C - 咕咕东的奇妙序列

题意

思路

这题一看就不是暴力能解决的事情。
而这题每一块的长度可以说是一个等差数列(或者说多个
1~9相差1
10~99相差2
……

所以可以想到用前缀和的方法,可以预处理全部前缀和(数组存) 真的在想peach,1e18的数据让人绝望。
但是,前缀和的思想还是没错的,我们可以求出 x 所在块之前的所有块数的长度之和,以及x所在块数的长度。这样我们就可以确定 x 的位置。
因为数据范围1e18,所以需要二分确定 x 属于哪一块,以及 x 属于哪个数(例如属于10,则x可能有1或0)。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#define llong long long
#define For(i,a,n) for(register llong i=a;i<=n;i++)
#define RF(i,a,n) for(register llong i=a;i>=n;i--)
using namespace std;

const int maxn = 100005;

llong q, n, p1, p2;
llong ans[50];

llong get_sum(llong x, int flag)
{//flag = 1: 表示求x所在块的前n块的长度(前缀和)
 //flag = 0: 表示求x所在块的长度
	llong i=1, j=1, ans=0;
	for(; 10*j<=x; i++,j*=10){
		if(flag)
			ans+=i*((1+9*j)*9*j/2)+i*j*9*(x-j*10+1);
		else
			ans+=i*9*j;
	}
	return flag?(ans+i*(x-j+2)*(x-j+1)/2):(ans+i*(x-j+1));
}

void solve(llong x)
{
	memset(ans,0,sizeof(ans));
	int tot = 0, p1 = 0, p2 = 0;
	//二分求x属于哪一块
	llong l=0, r=1e9;
	while(l<r-1){
		llong mid = (l+r)>>1;
		if(get_sum(mid, 1) < x){
			l = mid;
			p1 = mid;
		}
		else
			r = mid;
	}
	x-=get_sum(p1, 1);
	//二分求x属于哪个数
	l=0, r=p1+1;
	while(l<r-1){
		llong mid = (l+r)>>1;
		if(get_sum(mid, 0) < x){
			l = mid;
			p2 = mid;
		}
		else
			r = mid;
	}
	x-=get_sum(p2++, 0);

	//第几位
	while(p2){
		ans[tot++] = p2%10;
		p2/=10;
	}
	cout<<ans[tot-x]<<endl;
}

int main(){
    ios::sync_with_stdio(false);
	cin>>q;
	while(q--){
		cin>>n;
		solve(n);
	}
    return 0;
}

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

CSP M2(A - HRZ 的序列)(B - HRZ 学英语)(C - 咕咕东的奇妙序列) 的相关文章

随机推荐

  • Nginx 命令

    nginx 启动Nginx nginx s reopen 重启Nginx nginx s reload 重新加载Nginx配置文件 xff0c 然后以优雅的方式重启Nginx nginx s stop 强制停止Nginx服务 nginx s
  • jieba,为中文分词而生的Python库

    jieba xff0c 为中文分词而生的Python库 中文分词 xff0c 通俗来说 xff0c 就是将一句 段 话按一定的规则 算法 拆分成词语 成语 单个文字 中文分词是很多应用技术的前置技术 xff0c 如搜索引擎 机器翻译 词性标
  • MDK的内嵌汇编与内联汇编

    内联汇编 asm 34 指令 34 这是内联汇编 而MDK下 xff0c 内联汇编仅支持ARM汇编语言 xff0c 不支持Thumb或者Thumb 2汇编语言 xff0c 但内嵌汇编器支持Thumb和Thumb 2 STM32的core c
  • 【李刚-21天通关Python-08】之 字典

    李刚 21天通关Python 08 之 字典 一 字典的概念 1 字典用于保存具有映射关系的数据 xff0c 字典相当于保存了两组数据 xff0c 其中一组数据被称为key xff0c 另一组数据可通过key来访问 xff0c 被称为val
  • 按键精灵 百度文字识别(百度ocr)OCRSpace文字识别

    目录 1 申请百度OCR服务1 1 百度OCR登录1 2 创建新应用1 3 免费领取次数1 3 查看是否创建成功 2 按键精灵运用百度OCR接口2 1 通用文字识别 xff08 高精度版 xff09 文档2 1 1 接口描述2 1 2 请求
  • Ubuntu系统扩大/home分区

    gparted是一款免费 开源的Linux下的具有图形用户界面的分区软件 在Ubuntu中 xff0c 可以使用如下命令安装 xff1a sudo apt get install gparted 之后就可以使用如下命令启动gparted s
  • sqlsever导入sql文件

    sqlsever导入sql文件 新建一个数据库 xff0c 数据库名与到导入的文件的数据库名一致 把文件拖入当前窗口 xff0c 把创建表的语句删除 xff0c creat table到go语句之前 xff08 因为创建表的路径不一样 xf
  • Python接口自动化——自动化测试分层(1)

    从本期开始 xff0c 我们会围绕 Python接口自动化 做专题连载 xff0c 今天开始做第一讲 自动化测试分层 目录 xff1a 1 1 1 1 单元自动化测试 2 1 1 2 接口自动化测试 3 1 1 3 UI自动化测试 现在流行
  • C++快读模板(读入整型数据)

    先上代码 span class token macro property span class token directive keyword include span span class token string lt iostream
  • Linux安装jenkins2.3详解

    Linux安装jenkins2 3详解 下载 官网下载jenkins xff0c 我们选择rpm包进行安装 xff1a 地址 xff1a https mirrors jenkins ci org redhat https get jenki
  • 程序设计思维 week4 作业C-TT 的神秘礼物

    题目 TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT 任务
  • 程序设计思维 week11 作业E-东东与ATM

    题目 一家银行计划安装一台用于提取现金的机器 机器能够按要求的现金量发送适当的账单 机器使用正好N种不同的面额钞票 xff0c 例如D k xff0c k 61 1 2 N xff0c 并且对于每种面额D k xff0c 机器都有n k张钞
  • 程序设计思维 CSP-M3

    T1 瑞神的数列 题目 Sample Input 12 2 3 3 6 6 6 1 1 4 5 1 4 Sample Output 8 思路 利用vector xff0c 使用vector lt int gt v储存数字 若v为空 xff0
  • ubuntu一段时间后突然无法上网

    在VMware中安装Ubuntu虚拟机 xff0c 总会发生无法上网的情况 xff0c 主要情况有以下几点 xff1a 宿主机可以上网 xff1b 虚拟机却无法访问网页虚拟机ping不通任何网站 xff0c 用浏览器显示error 一般情况
  • STM32 - 使用 HAL 库实现软件模拟 I2C

    不要让自己太懒的个人空间 I2C 的两个引脚 xff08 SCL 引脚和 SDA 引脚 xff09 需要既能输出又能输入 xff0c 为了避免复杂的配置操作需要把该引脚配置为开漏输出模式 xff0c 该模式的说明如下图所示 xff1a 当单
  • 二进制基础:补码,左移,右移

    binary 引入为什么要有补码特殊的值溢出数学移位逻辑位移逻辑右移的应用 引入 二进制是计算机的基础 xff0c 追根溯源还是因为Si的半导体性 除了二进制 xff0c 还有十六进制 xff0c 它是简化二进制的表示 做个测试 xff1a
  • GitLab配置SSH key

    1 我们已经有了gitlab的账户 xff0c 项目组已经将我们添加到了group 2 打开git bash xff0c 输入命令 ls al ssh 如果显示如下图 xff1a 则表示生成过key 可以去执行第4个步骤 否则的话执行第三个
  • centos误删python2后怎么重新安装

    此教程为离线安装 一 先查询系统版本 cat proc version Linux version 3 10 0 1127 el7 x86 64 mockbuild 64 kbuilder bsys centos org gcc versi
  • Week 6 H (A - 氪金带东)(B - 戴好口罩!)(C - 掌握魔法の东东 I)(D - 数据中心)

    Week 6 A 氪金带东题意思路代码 B 戴好口罩 xff01 题意思路代码 C 掌握魔法 东东 I题意思路代码 D 数据中心题意思路代码 A 氪金带东 题意 思路 首先 xff0c 这个图是棵树 解法 xff1a 三遍DFS 前两遍用来
  • CSP M2(A - HRZ 的序列)(B - HRZ 学英语)(C - 咕咕东的奇妙序列)

    CSP M2 A HRZ 的序列题意思路代码 B HRZ 学英语题意思路代码 C 咕咕东的奇妙序列题意思路代码 A HRZ 的序列 题意 思路 我们先求有多少个不同的数 xff0c 记为cnt xff0c 然后分情况进行处理 cnt gt