【2021 CSP-J第二轮题解】
一、分糖果
题意解析:
给定n,L,R,选取一个正整数k(L≤k≤R),使的k mod n的值ans最大,并输出ans。
根据取余运算的规律,可以得下图:
也就是说,L和R有两种不同的情况:
- L和R处于同一条线段,则ans最大就是R%n
- L和R处于不同线段,则ans最大就是n-1
而L和R是否处于同一条线段取决于L/n和R/n是否相等
代码如下:
#include <iostream>
using namespace std;int main() {int n, L, R;cin >> n >> L >> R;if (R / n == L / n) {cout << R % n << endl;} else {cout << n - 1 << endl;}return 0;
}
二、插入排序
题意解析:
首先得到一个长度为n的无序数组a,然后进行Q项操作
操作1:将数组第x个元素a[x]的值修改为v,得到新的数组a
操作2:对数组a进行排序,输出原数组a[x]在排序后的位置,排序后的数组不保留
注意:对于相同的数据项,要保持原有的顺序,操作1最多只有5000次。
算法分析:
插入排序的时间复杂度为O(n2),如果用暴力模拟,即每进行一次操作1,就用一次插入排序,进行5000项操作1的复杂度就是O(5000n2),分析测试点可知暴力模拟只能喜提30分。
如果用一次插入排序,并记录下每个数据在原始数组中的位置pos,在进行操作1时,判断v和原始值的大小来选择向前插入还是向后插入,每次的操作时间复杂度就是O(n),5000次操作1的总体时间复杂度为O(5000n).
代码:
#include <iostream>
using namespace std;
int n, q;struct node {int data, pos;//pos 表示原数组的位置
} a[8010];int num[8010];//num[i]表示原数组第i个元素,排序后所在的位置
void insertSort() {//插入排序for (int i = 1; i <= n; i++) {for (int j = i; j >= 2; j--) {if (a[j].data < a[j - 1].data) {num[a[j].pos] = j - 1;num[a[j - 1].pos] = j;node t = a[j - 1];a[j - 1] = a[j];a[j] = t;}}}
}void change(int x, int v) {//修改数组值,然后排序int tmp = a[num[x]].data;if (tmp == v)return;a[num[x]].data = v;if (v > tmp) {for (int i = num[x] + 1; i <= n; i++) {if (a[i].data < a[i - 1].data || (a[i].data == a[i - 1].data && a[i].pos < a[i - 1].pos)) {num[a[i].pos] = i - 1;num[a[i - 1].pos] = i;node t = a[i];a[i] = a[i - 1];a[i - 1] = t;} elsebreak;}} else {for (int i = num[x]; i >= 2; i--) {if (a[i].data < a[i - 1].data || (a[i].data == a[i - 1].data && a[i].pos < a[i - 1].pos)) {num[a[i].pos] = i - 1;num[a[i - 1].pos] = i;node t = a[i];a[i] = a[i - 1];a[i - 1] = t;} elsebreak;}}
}int main() {cin >> n >> q;for (int i = 1; i <= n; i++) {cin >> a[i].data;a[i].pos = i;num[i] = i;}insertSort();int c, x, v;while (q--) {cin >> c >> x;if (c == 1) {cin >> v;change(x, v);} else {cout << num[x] << endl;}}return 0;
}
三、网络连接
题意解析:
模拟题,题意比较简单,重点是判断地址串a.b.c.d:e的合法性,需要细心排除不合法的每一种情况。判断字符串是否规范,首先想到正则表达式,考虑到地址串的长度最长为22位,数据规模n<=1000,用正则表达式容易超时,因此可以采用sscanf(str,“格式符”,变量地址列表),返回值为t,如果t!=5则非法,再判断a,b,c,d,e各项是否合规。然后再把a,b,c,d,e按照标准格式组成地址串,和原地址串比较是否一样,也可检验前导0的问题。
代码:
#include <bits/stdc++.h>
using namespace std;
map<string, int> vis;
int n;bool isIP(char s[]) {bool rv = true;int a = -1, b = -1, c = -1, d = -1, e = -1;int t = sscanf(s, "%d.%d.%d.%d:%d", &a, &b, &c, &d, &e); //格式化读入字符串if (t != 5) {//如果不是5个数据,表明地址串格式有问题,返回falserv = false;return rv;}if (a > 255 || b > 255 || c > 255 || d > 255 || e > 65535) {rv = false;return rv;}char s2[35];sprintf(s2, "%d.%d.%d.%d:%d", a, b, c, d, e); //保存至s2中int lens = strlen(s); //前导0问题判断for (int i = 0; i < lens; i++) {if (s[i] != s2[i]) {rv = false;break;}}return rv;
}int main() {cin >> n;for (int i = 1; i <= n; i++) {char op[1005], ip[1005];cin >> op >> ip;string t(ip);if (op[0] == 'S') { //服务器if (!isIP(ip))//判断IP地址是否合法cout << "ERR" << endl;else if (vis.count(t) != 0) {cout << "FAIL" << endl;} else {cout << "OK" << endl;vis[t] = i;//写入合法的服务器地址和编号}} else { //客户机if (!isIP(ip)) { //判断IP地址是否合法cout << "ERR" << endl;} else if (vis.count(t) == 0) {cout << "FAIL" << endl;} else {cout << vis[ip] << endl;}}}return 0;
}
四、小熊的果篮
题意解析:
按顺序摆放n个两种水果,连续排一起的同一种水果为一个块,每次挑选一个块的第一水果,重复到水果被挑完。输出每次挑选的水果序列。
算法分析:
(30分解法)暴力模拟,时间复杂度为O(n2),考虑到数据范围,将会有30%以上的数据能通过。
(70分解法)对暴力模拟稍作优化即可得到时间复杂度为O(nlogn)的解法,可以说是高性价比思路。
(100分解法)如果会链表或者set任意一种数据结构就能轻松AC。
70分代码:
#include <iostream>
using namespace std;
int n;struct node {int data;bool taken;
} list[200010];int main() {cin >> n;for (int i = 1; i <= n; i++) {scanf("%d", &list[i].data);list[i].taken = false;}int k = 1;while (k <= n) {if (!list[k].taken) {int tmp = -1;for (int i = k; i <= n; i++) {//判断是否一个块的开头if (!list[i].taken) {if (tmp != list[i].data) {//如果是块的开头,标记取出printf("%d ", i);list[i].taken = true;tmp = list[i].data;}}}printf("\n");}k++;}return 0;
}
AC代码:
#include <bits/stdc++.h>
using namespace std;struct node {int type;//水果类型int Next;int tail;
} f[200010];
int n;int main() {cin >> n;f[0].type = -1;vector<int> headVec;//存储各个块的第一个元素下标int head = -1;for (int i = 1; i <= n; i++) {scanf("%d", &f[i].type);if (f[i].type != f[i - 1].type) {headVec.push_back(i);head = i;} else {f[i - 1].Next = i;f[head].tail = i;//head是链表的首元素位置,tail是尾元素位置}}int cnt = 1;while (cnt <= n) {vector<int> tmpHeadVec;for (int i = 0; i < (int)headVec.size(); i++) {head = headVec[i];printf("%d ", headVec[i]);int nxt = f[head].Next;if (nxt == 0) {continue;}if (tmpHeadVec.empty() || f[tmpHeadVec.back()].type != f[nxt].type) {//标记下一轮各个链表里的首元素tmpHeadVec.push_back(nxt);f[nxt].tail = f[head].tail;} else if (f[tmpHeadVec.back()].type == f[nxt].type) { //合并链表int lastHead = tmpHeadVec.back();int lastTail = f[lastHead].tail;f[lastTail].Next = nxt;f[lastHead].tail = f[head].tail;}}printf("\n");headVec = tmpHeadVec;cnt++;}return 0;
}
【2021 CSP-J第二轮题解】相关推荐
- 【题解】CSP-J2021第二轮题解
CSP-J2021第二轮题解 T1.分糖果 ⊗ \otimes ⊗ 简化题目:给定 l , r l,r l,r,求 max i = l r ( i m o d n ) \max_{i=l}^{r} ...
- 【题解】CSP2022-J第二轮题解
概述 & 前言 看到许多评价,说这次 CSP-J\texttt{CSP-J}CSP-J 的比赛题目质量甚至不如你谷的模拟赛,再加上 whk 实在落下太多了,所以就没打算补题.但是学校的老师非让 ...
- 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解
文章目录 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解 1.求余 2.双阶乘 3.格点 4.整数分解 5.城邦 6.特殊年份 7.小平方 8.完全平方数 9.负载均衡 10.国际象棋 20 ...
- 中国工程院2021年院士增选第二轮候选人名单公布
来源:先进制造业 中国工程院2021年院士增选进入第二轮评审候选人名单 (按候选人姓名拼音排序) 未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测:开展互联网(城市 ...
- 2021年NBA季后赛第二轮晋级预测
2021年NBA季后赛第二轮晋级预测 1.西部球队晋级预测如下: 爵士VS快船,快船晋级. 太阳VS掘金,掘金晋级. 2.东部球队晋级预测如下: 篮网VS雄鹿,篮网晋级. 76人VS老鹰,76人晋级. ...
- 【第二轮征稿开启】ICRAIC 2021 机器人、自动化与智能控制国际会议诚邀您的参与!
机器人.自动化与智能控制国际会议(ICRAIC 2021) 2021 International Conference on Robotics Automation and Intelligent C ...
- .net 遍历数组找重复值写入一个新数组_第二轮 Python 刷题笔记一:数组
经过四十多天缓慢的刷题,现在进度大概是刷了八十多道 LeetCode 题,最近也在吸取过来人的经验,仍然需要对刷题计划进行调整. 首先明确一下目标,我是有些 Python 基础,想通过刷题掌握更多算法 ...
- NOIP历年第二轮入门组真题集合
NOIP历年第二轮入门组真题集合 年份 题目 题解链接 2000 T1-计算器的改良 T2- 税收与补贴问题 T3-乘积最大 T4-单词接龙 题解链接 2001 T1-数的记数 T2-最大公约数和最小 ...
- 详解CSP-J/S第二轮认证
CSP-J/S第二轮时间 CSP-J/S第二轮分为:CSP-J2和CSP-S2,必须先参加第一轮,达到一定的分数者方可参加第二轮.CSP-J/S第二轮在11月份第三个星期六和星期日进行. CSP-J/ ...
最新文章
- 招商银行行长田惠宇:疫情对信用卡业务造成影响最大,40%催收产能在武汉
- poj 1230(贪心)
- 表同步更新的问题的触发器
- 平板电脑安装软件_分享一个将平板作为电脑分屏的软件(文末有链接)
- java小区管理的项目描述,基于jsp的小区信息管理-JavaEE实现小区信息管理 - java项目源码...
- 中国程序员的最后归宿
- Vue.js学习总结(1)——Windows下Vue.js开发环境搭建
- js 获取元素文本_可能是最全的“文本溢出截断省略”方案合集
- 基于Python-turtle库绘图(汇总)
- matlab直线的程序,MATLAB|辅助直线绘制程序
- HOMAG工控机维修西门子IPC627D维修HG-A.1.0
- 010 Editor逆向分析文档
- DTCC大会归来感想
- 夜光带你走进Jquery(十三)擅长的领域
- 网站安全检测及安全工具
- 二月、三月校招面试复盘总结(二)
- Vue3 组件通信方式【最好用的都在这里了】
- 如何在Python中四舍五入数字
- android中setClickable,setEnabled,setFocusable的含义及区别
- 一、Java语言简介