一、分糖果

题意解析:

给定n,L,R,选取一个正整数k(L≤k≤R),使的k mod n的值ans最大,并输出ans。
根据取余运算的规律,可以得下图:

也就是说,L和R有两种不同的情况:

  1. L和R处于同一条线段,则ans最大就是R%n
  2. 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第二轮题解】相关推荐

  1. 【题解】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} ...

  2. 【题解】CSP2022-J第二轮题解

    概述 & 前言 看到许多评价,说这次 CSP-J\texttt{CSP-J}CSP-J 的比赛题目质量甚至不如你谷的模拟赛,再加上 whk 实在落下太多了,所以就没打算补题.但是学校的老师非让 ...

  3. 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解

    文章目录 2021年第十二届蓝桥杯省赛B组(C/C++)第二场题解 1.求余 2.双阶乘 3.格点 4.整数分解 5.城邦 6.特殊年份 7.小平方 8.完全平方数 9.负载均衡 10.国际象棋 20 ...

  4. 中国工程院2021年院士增选第二轮候选人名单公布

    来源:先进制造业 中国工程院2021年院士增选进入第二轮评审候选人名单 (按候选人姓名拼音排序) 未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测:开展互联网(城市 ...

  5. 2021年NBA季后赛第二轮晋级预测

    2021年NBA季后赛第二轮晋级预测 1.西部球队晋级预测如下: 爵士VS快船,快船晋级. 太阳VS掘金,掘金晋级. 2.东部球队晋级预测如下: 篮网VS雄鹿,篮网晋级. 76人VS老鹰,76人晋级. ...

  6. 【第二轮征稿开启】ICRAIC 2021 机器人、自动化与智能控制国际会议诚邀您的参与!

    机器人.自动化与智能控制国际会议(ICRAIC 2021) 2021 International Conference on Robotics Automation and Intelligent C ...

  7. .net 遍历数组找重复值写入一个新数组_第二轮 Python 刷题笔记一:数组

    经过四十多天缓慢的刷题,现在进度大概是刷了八十多道 LeetCode 题,最近也在吸取过来人的经验,仍然需要对刷题计划进行调整. 首先明确一下目标,我是有些 Python 基础,想通过刷题掌握更多算法 ...

  8. NOIP历年第二轮入门组真题集合

    NOIP历年第二轮入门组真题集合 年份 题目 题解链接 2000 T1-计算器的改良 T2- 税收与补贴问题 T3-乘积最大 T4-单词接龙 题解链接 2001 T1-数的记数 T2-最大公约数和最小 ...

  9. 详解CSP-J/S第二轮认证

    CSP-J/S第二轮时间 CSP-J/S第二轮分为:CSP-J2和CSP-S2,必须先参加第一轮,达到一定的分数者方可参加第二轮.CSP-J/S第二轮在11月份第三个星期六和星期日进行. CSP-J/ ...

最新文章

  1. 招商银行行长田惠宇:疫情对信用卡业务造成影响最大,40%催收产能在武汉
  2. poj 1230(贪心)
  3. 表同步更新的问题的触发器
  4. 平板电脑安装软件_分享一个将平板作为电脑分屏的软件(文末有链接)
  5. java小区管理的项目描述,基于jsp的小区信息管理-JavaEE实现小区信息管理 - java项目源码...
  6. 中国程序员的最后归宿
  7. Vue.js学习总结(1)——Windows下Vue.js开发环境搭建
  8. js 获取元素文本_可能是最全的“文本溢出截断省略”方案合集
  9. 基于Python-turtle库绘图(汇总)
  10. matlab直线的程序,MATLAB|辅助直线绘制程序
  11. HOMAG工控机维修西门子IPC627D维修HG-A.1.0
  12. 010 Editor逆向分析文档
  13. DTCC大会归来感想
  14. 夜光带你走进Jquery(十三)擅长的领域
  15. 网站安全检测及安全工具
  16. 二月、三月校招面试复盘总结(二)
  17. Vue3 组件通信方式【最好用的都在这里了】
  18. 如何在Python中四舍五入数字
  19. android中setClickable,setEnabled,setFocusable的含义及区别
  20. 一、Java语言简介

热门文章

  1. DIY Gamebuino Classic游戏机
  2. 【趣味案例】用Python来做一个屏幕录制工具
  3. Ubuntu 截图工具 Flameshot
  4. strtoupper php 中文,strtoupper回导致中文乱码么
  5. 服务器重装系统c盘过大,C盘满了,不想重装系统怎么办?
  6. 用户画像场景与技术实现方案
  7. Java基础3-循环
  8. signal函数详解
  9. 第一章:客户端网页编程简介
  10. 贝叶斯统计分析中的基本概念和基本方法