[模拟] 警察的询问
文章目录
- 题目
- 题解
- 代码
题目
题目描述
HanHanHan找来兄弟伙DominikDominikDominik帮他写程序,搞了一个通宵后,DominikDominikDominik有点恍惚就回家了,回家路上被警察盘问,警察怀疑他喝了酒,于是警察问:冒泡排序时间复杂度是多少?DominikDominikDominik轻松回答nnn的平方。警察又问倒着说出英文字母表,DominikDominikDominik回答zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba。警察说这是你背的,没有思考,于是准备出道难题
现在想象一下,英语字母表中从“aaa”到“zzz”的所有字母都是顺时针方向写在一个圆圈里的。以字母“aaa”开头,顺时针读。在每读一个字母后,警察会提出操作或询问,操作是以当前字母反向读,询问是当读到nnn个字母后,xxx字母被读过几次?
明白规则后,DominikDominikDominik便开始从aaa开始读了,请你编写一个程序,解决警察的问题。
输入
第一行,一个整数QQQ,表示操作和询问总数(1≤Q≤100000)(1 ≤ Q ≤ 100000)(1≤Q≤100000)
接下来QQQ行,若是UPITnxUPIT\ n\ xUPIT n x,UPITUPITUPIT为克罗地亚语,表示询问,即读到第nnn个字母时xxx出现了几次?
若是SMJERnSMJER\ nSMJER n,SMJERSMJERSMJER为克罗地亚语,表示操作,即读到第nnn个字母时反向读。
xxx为小写字母aza~za z
nnn的取值范围是(1≤n≤1e9)(1 ≤ n ≤ 1e9)(1≤n≤1e9)
输出
一共询问行
每行一个整数,询问结果,即xxx出现的次数
样例输入
5
UPIT 1 b
UPIT 3 b
SMJER 4
UPIT 7 a
UPIT 10 z
样例输出
0
1
2
1
题解
先吐槽一波,考试时老师一直说这个题很难,搞得我想到模拟的时候一阵慌不敢打
但这个题一看就是模拟啊。。。
我们只需要用一个变量记录当前读字母的方向,由于数据保证nnn递增,我们就直接循环两次询问之间所经过的字母,将每一个字母出现的次数加一即可,这有什么难的
最后要考虑一个优化,不然O(NQ)O(NQ)O(NQ)的复杂度肯定超时,如果两次nnn相差很大,我们可以直接算出读了多少圈,也就是每个字母一定会被读到的次数,再将剩余的处理就可以了
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int q, n, start, step;
int cnt[30];
char s;
char a[10];
bool dir; //0顺1逆int main() {scanf("%d", &q);step = 0;start = 0;for(int i = 1; i <= q; i ++) {scanf("\n");scanf("%s", a);scanf("%d", &n);int p = n - step;for(int i = 1; i <= 26; i ++)cnt[i] += p / 26;p %= 26;if(dir == 0) {for(int i = 1; i <= p; i ++) {if(start + i <= 26) cnt[start + i] ++;else cnt[(start + i) % 26] ++;}start += p;if(start > 26) start %= 26;}else {for(int i = 1; i <= p; i ++) {if(start - i >= 1) cnt[start - i] ++;else cnt[start - i + 26] ++;}start -= p;if(start < 1) start += 26;}if(a[0] == 'U') {s = getchar();s = getchar();printf("%d\n", cnt[s - 'a' + 1]);}else {if(dir == 0) dir = 1;else dir = 0;}step = n;}return 0;
}
[模拟] 警察的询问相关推荐
- 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述:
老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N ...
- 【华为上机试题C++】老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.
老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N ...
- 计算机教授技术追踪劫匪,打脸 911警察
2018年即将过去的周末,对史弋宇博士一家来说是惊心动魄的两天. 为了满足女儿寒假想去海岛度假扮演Moana公主的愿望,又考虑到太太又因怀孕无法前往有寨卡病毒的地区(包括绝大部分加勒比海地区),史博士 ...
- 【基本操作】主席数统计区间不同颜色个数
例题:询问 $n$ 个数中无修改的区间不同数个数,不带修改(SPOJ的一道题). 方法1:直接删 我们尝试头铁地开正常的下标主席树! 依次插入 $n$ 个数,插入第 $i$ 个数时,我们只要在把第 $ ...
- 求职者提问的问题面试官不会_如何通过三个简单的问题就不会陷入求职困境
求职者提问的问题面试官不会 by DJ Chung 由DJ Chung 如何通过三个简单的问题就不会陷入求职困境 (How to get un-stuck in your job search wit ...
- 暑期集训5:并查集 线段树 练习题G: HDU - 1754
2018学校暑期集训第五天--并查集 线段树 练习题G -- HDU - 1754 I Hate It 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让 ...
- 杭电1754--I Hate It(线段树)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU1754_I Hate It(线段树/单点更新)
解题报告 题意: 略 思路: 单点替换,区间最值 #include <iostream> #include <cstring> #include <cstdio> ...
- I Hate It(线段树基础)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
最新文章
- malloc 和alloc及calloc的区别
- girton college map
- 【Python】while里面是负数时条件还为真吗?
- 在NumericStepper控件中使用嵌入字体显示数字.
- BeanDefinitionRegistryPostProcessor​ 的处理源码流程
- Enterprise Library Step By Step系列(一):配置应用程序块——入门篇
- 说说如何用JavaScript实现一个模板引擎
- MTU MSS 详解记录
- Security+ 学习笔记19 密码学应用
- 2020华为软挑热身赛
- 下载速度15MB/s,度盘新版本?
- Bootstrap辅助类之文本情景类
- bilibili ,B站视频预览缩略图实现分析
- Python 关于日期相减 获得两个日期的天数差
- 电脑里有老版java删不掉,电脑上的一些文件老是删不掉怎么办 win7中经常出现一些文件夹删不掉...
- k8s部署EFK实现日志管理(mac desktop)
- C#获取微信打卡数据
- python 制作 二维码
- Python(py3fdfs)上传到fastdfs配置store_serv.ip_addr问题
- 工作中使用到的单词(软件开发)_2021-12-26_备份
热门文章
- 在线伪原创-免费批量在线伪原创工具
- 计算机学院学生会会徽,学生会会徽策划书
- cleanmymac3.9.6_ArcGIS 10.6技术特点
- 整合Tkinter GUI界面的古诗词词云生成
- ceph admin socket机制
- 中南大学刘嘉忆(刘路)论文--破解西塔潘猜想.pdf
- c 获取webform页面html,C#-WebForm-纯HTML提交方式
- delphi android jni,Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用...
- mysql远程不能访问_解决MySQL无法远程访问的3方案
- 切换终端_桐见 | 智能生活随心切换,车联网整合方案无缝连接生态终端