程序设计思维与实践 CSP-M2 (3/4/数据班)
HRZ的序列
题意:
相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列a,他对这个序列产生了浓厚的兴趣。
他好奇是否存在一个数K,使得一些数加上K,一些数减去K,一些数不变,使得整个序列中所有的数相等。
其中对于序列中的每个位置上的数字,至多只能执行一次加运算或减运算或是对该位置不进行任何操作。
由于瑞神只会刷B站,所以他把这个问题交给了你!
思路:
使用三个数记录当前的序列就可,如果超过三个数或者三个数之间不符合要求,就输出NO。
总结:
这个题其实比较简单,提交的时候没有初始化,爆0了。
代码:
#include <iostream>
using namespace std;
const int N = 100000 + 1;
int t, n;
long long a[N];
long long p1, p2, p3;
bool b1 = false, b2 = false, b3 = false;
int main()
{cin >> t;while (t--){cin >> n;bool flag = true;b1 = false, b2 = false, b3 = false;for (int i = 1; i <= n; i++){long long temp;cin >> temp;if (!b1){p1 = temp;b1 = true;}else if (b1 && p1 == temp)continue;else if (!b2){p2 = temp;b2 = true;}else if (b2 && p2 == temp)continue;else if (!b3){p3 = temp;b3 = true;}else if (b3 && p3 == temp)continue;elseflag = false;}if (!flag)cout << "NO" << endl;else if (!b2 || !b3 || p1 + p2 == 2 * p3 || p1 + p3 == 2 * p2 || p2 + p3 == 2 * p1)cout << "YES" << endl;elsecout << "NO" << endl;}
}
B - HRZ 学英语
题意:
瑞神今年大三了,他在寒假学会了英文的26个字母,所以他很兴奋!
于是他让他的朋友TT考考他,TT想到了一个考瑞神的好问题:给定一个字符串,从里面寻找 连续的26个大写字母 并输出!
但是转念一想,这样太便宜瑞神了,所以他加大了难度:现在给定一个字符串,字符串中包括26个大写字母和特殊字符’?’,特殊字符’?'可以代表任何一个大写字母。
现在TT问你是否存在一个 位置连续的且由26个大写字母组成的子串 ,在这个子串中每个字母出现且仅出现一次,如果存在,请输出从左侧算起的第一个出现的符合要求的子串,并且要求,如果有多组解同时符合位置最靠左,则输出字典序最小的那个解!如果不存在,输出-1!
这下HRZ蒙圈了,他刚学会26个字母,这对他来说太难了,所以他来求助你,请你帮他解决这个问题,报酬是可以帮你打守望先锋。
说明:字典序 先按照第一个字母,以 A、B、C……Z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,SIGH 和 SIGHT),那么把短者排在前。例如
AB??EFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
ABDCEFGHIJKLMNOPQRSTUVWXYZ
上面两种填法,都可以构成26个字母,但是我们要求字典序最小,只能取前者。
注意,题目要求的是 第一个出现的, 字典序最小的 !
思路:
尺取法,真的不难。
总结:
没有认真读题,第一个出现的符合要求的子串!!!!
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
string s;
string ch;
int sum[27], l = 0, r = 0;
void Minus(int x)
{int len = s[x] - 'A';int len2 = '?' - 'A';(len == len2) ? sum[26]-- : sum[len]--;
}
void Plus(int x)
{int len = s[x] - 'A';int len2 = '?' - 'A';(len == len2) ? sum[26]++ : sum[len]++;
}
bool check()
{int num = sum[26];for (int i = 0; i < 26; i++){if (sum[i] == 0 && num == 0)return false;else if (sum[i] == 0)num--;}ch = s.substr(l, 26);return true;
}
void print()
{int j = 0;char ch2[26];int num = sum[26];int a = 0;for (int i = 0; i < 26; i++){if (sum[i] == 0)ch2[a++] = char(i + 'A');}a = 0;for (int i = 0; i < 26; i++){if (ch[i] != '?')cout << ch[i];elsecout << ch2[a++];}
}
int main()
{int flag = 0;cin >> s;while (r < s.size()){if (check()){print();//system("pause");return 0;}else if ((r - l) < 26)Plus(r++);else{Plus(r++);Minus(l++);}}if (check()){print();//system("pause");return 0;}cout << -1;//system("pause");
}
C - 咕咕东的奇妙序列
题意:
咕咕东 正在上可怕的复变函数,但对于稳拿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 项数字是多少!但是她睡醒之后发现老师讲的东西已经听不懂了,因此她把这个任务交给了你。
思路:
这个题具体实现方法五花八门,但实际上都是通过分组,然后搜索,最终找到k。
分组总共有三步:
- 首先,如下图所示,将整个数列分成0-9行,10-99行等等。
- 找到对应的块后,我们需要搜索k在第几行。二分法
- 找到行后,我们需要搜索k的具体位置。使用log
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;int q, len;
long long k, sum[20], up[20], down[20], num[20], height = 9;
//sum数组存储当前块为止字符数,up,down分别是当前块的上底和下底,num是最长层内分组
int main()
{for (int i = 1;; i++){ //计算到此块为止字符数len = i;num[i] = i * height + num[i - 1];up[i] = down[i - 1] + i; //上底down[i] = up[i] + i * (height - 1); //下底sum[i] = sum[i - 1] + ((up[i] + down[i]) * height) / 2; //梯形面积if (sum[i] >= 1e18)break;height *= 10; //高}scanf("%d", &q);while (q--){scanf("%lld", &k);for (int i = 1; i <= len; i++){ //搜块if (k <= sum[i]){ //在第i块k -= sum[i - 1]; //更新k的数值height = ((down[i] - up[i]) / i) + 1;long long left = 1, right = height, level = 0;while (left + 1 < right){ //二分层数,搜层long long mid = (left + right) / 2;long long temp = ((up[i] + (up[i] + i * (mid - 1))) * mid) / 2;if (temp > k)right = mid; //在上面elseleft = mid; //在下面}//由于当前数字不能确定是left层还是right层,在这里比较一下if (((up[i] + (up[i] + i * (left - 1))) * left) / 2 < k)level = right;elselevel = left;k = k - ((up[i] + (up[i] + i * (level - 2))) * (level - 1)) / 2; //当前层内第k个数//搜索到是level层,开始层内搜组for (int j = 1; j <= i; j++){if (k <= num[j]){ //找到了,在第j组内k -= num[j - 1];int remainder = (k % j == 0 ? j : k % j);k = ceil(k * 1.0 / j * 1.0); //第j组内的第k个数int theNumber = k + pow(10, j - 1) - 1;//要的数字是theNumber中的第reminder个数int temp = (int)log10(theNumber) + 1 - remainder;while (temp--)theNumber /= 10;printf("%d\n", theNumber % 10);break;}}break;}}}return 0;
}
总结:
这三道题,其实前两道自己都会做,但是因为不细心,爆0了
第三道题可以打表得60分,但是经验太少了,没意识到。这个题细心一点应该也能做出来。
程序设计思维与实践 CSP-M2 (3/4/数据班)相关推荐
- 程序设计思维与实践 Week9 作业 (3/4/数据班)
A-咕咕东的目录管理器 题意: 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从实 ...
- 程序设计思维与实践 csp路径解析、csp炉石传说
目录 路径解析 输入格式 输出格式 样例 想法: 代码: 炉石传说 描述: 输入格式: 输出格式: 样例: 评测用例规模与约定: 想法: 代码: 路径解析 描述: 在操作系统中,数据通常以文件的形式存 ...
- 程序设计思维与实践Week9 作业 (1/2/智能班)
A - 咕咕东的目录管理器 题面 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从 ...
- 山东大学程序设计思维与实践 四月模拟:TT与可怜的猫
4月模拟-TT与可怜的猫 程序设计思维实践-复杂模拟题训练2 山东大学计算机科学与技术学院程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业 山大程序设计思维实践 山东大学程序 ...
- 山东大学计算机科学与技术学院程序设计思维与实践作业 week10-树型数据结构及其应用
山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践作业 sdu程序设计思维与实践 山东大学程序设计思维实践作业H10 山大程序设计思维实践作业H10 山东大学程序设计思维与实践 ...
- 山大程序设计思维与实践 六月模拟:猪国杀
六月模拟:猪国杀 山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业H 山大程序设计思维实践作业H 山东大学程序设计思维 ...
- 程序设计思维与实践 Week9 作业三道
A - 咕咕东的目录管理器 题面 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从 ...
- 山东大学计算机科学与技术学院程序设计思维与实践作业 week5-数学基础与线性结构
山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践作业 sdu程序设计思维与实践 山东大学程序设计思维实践作业H5 山大程序设计思维实践作业H5 山东大学程序设计思维与实践 w ...
- 程序设计思维与实践 Month3 模拟
文章目录 CSP 201609-3 炉石传说 1. 问题描述 2. 思路历程 3. 具体实现 4. 代码 CSP 201609-3 炉石传说 1. 问题描述 游戏在一个战斗棋盘上进行,由两名玩家轮流进 ...
- 程序设计思维与实践 Week15 作业 A-ZJM与霍格沃兹
题目链接:A-ZJM与霍格沃兹 题目描述: ZJM 为了准备霍格沃兹的期末考试,决心背魔咒词典,一举拿下咒语翻译题 题库格式:[魔咒] 对应功能 背完题库后,ZJM 开始刷题,现共有 N 道题,每道题 ...
最新文章
- php 魔术方法 说明
- 哪个瞬间让你突然觉得CV技术真有用?
- GitHub Draft Pull请求支持新的协作流程
- Spring Boot加载配置文件
- 线程为什么调用start()而不是直接调用run()
- log4j2入门(四) log4j2.xml配置文件详细实例
- 交互式计算机图形学总结:第四章 观察
- Echars折线配置详解
- LateX在windows中运用MiKTeX
- C++之vs2017导出动态库失败
- Redux入门教程(快速上手)_day_01
- Python教学视频(三)数据类型及类型间的转换
- 如何通过Google学术快速获取参考文献引用格式-2021年
- 宝马、奔驰、路虎、捷豹、卡宴、杜比音效DTS音乐下载
- 杰奇2.4珊瑚模板简繁转换出现乱码怎么解决
- 基于react hook的砸金蛋动画
- 面向对象程序设计及C++mooc编程(第六章)--by sCh3n
- 【技术公开课】iOS App研发的最后冲刺:内测与部署
- OSChina 周六乱弹 —— 给你看个小仙女
- [Python][sklearn] 使用from sklearn.neighbors import NearestNeighbors计算相似度