洛谷2月普及组(月赛)

news2024/9/28 17:31:30

 🌼小宇(治愈版) - 刘大拿 - 单曲 - 网易云音乐 

OI赛制且难度对标蓝桥杯省赛(😥真难,第三题做了几百年,第四题只敢骗骗分)

花了10块钱🙃 买官网的思路,结果还是习惯自己硬磕,别人的思路根本不想看,还不如自己百度

切记切记,OI赛制是部分分 + 无反馈

所以骗分很重要

骗分 = 样例 + 模拟 + 暴力

养成先测试再提交的好习惯,否则,你以为你天王盖地虎,原来是个二百五 

👊总结 

总结写在前头

1,骗分 = 样例 + 模拟 + 暴力

2,不论是codeforces还是洛谷,只做对样例,不给分,盲猜改革后的蓝桥杯也没分

3,不论是codeforces还是洛谷,凡是和数字有关的,都和奇偶数规律有着千丝万缕的关系

4,第三题,AC 100%需要(邻接表 + STL的priority_queue + Dijkstra),我还有邻接表没学,先留个坑,日后有时间回来做 

目录

👊总结 

👊一,P9063 [yLOI2023] 分解只因数

🌼解法1    AC 100%

🌼解法2    AC 90%

🌼解法3    AC 60% 

👊二,P9064 [yLOI2023] 苦竹林

🌼AC 30% 

🌼AC  100% 

👊三,P9065 [yLOI2023] 云梦谣

🌼AC  5%

👊四,P9066 [yLOI2023] 腐草为萤

🌼AC  5%


👊一,P9063 [yLOI2023] 分解只因数

P9063 [yLOI2023] 分解只因数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

通过率 10% 

难度:入门 

 

首先要理解n不一定需要相乘得到的,比如 11 == 11,3 == 3,也可以是等本身,所以3和11也是只因数,一开始钻牛角尖了 

🌼解法1    AC 100%

因数中只要存在偶数,也就是不全为奇数,累乘的n就是偶数

所以,当n是偶数,说明质因数中存在偶数;当n是奇数,质因数全为奇数

所以n是奇数时输出"Yes",n是偶数时输出"No"

#include<iostream>
#include<cstdio> //scanf()
using namespace std;
typedef long long LL;
bool check(LL n)
{
    if(n % 2 == 1) return true;
    return false;
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t) {
        LL n;
        scanf("%lld", &n);
        if(check(n)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
        t--;
    }
    return 0;
}
5
2
No
3
Yes
4
No
6
No
9
Yes

4
12
No
123
Yes
1234
No
12345
Yes

🌼解法2    AC 90%

常规解法,对质数,因数不熟练的新手,耗时比较久,比如我

质数:能被1和本身整除的数

1,遍历到m的平方差,即 i * i <= m

2,m % i == 0,则 m 不是质数

#include<iostream>
#include<cstdio> //scanf()
using namespace std;
typedef long long LL;
bool check(LL n)
{
    int flag = 1;
    if(n == 1 || n == 2) return false; //1不是质数, 2是偶数
    int m;
    for(m = 2; m * m <= n; ++m) {
        for(int i = 2; i * i <= m; ++i)
            if(m % i == 0) {
                flag = 0; //m不是质数
                break;
            }
        if(flag && n % m == 0) //m是质数且是n的因子
            if(m % 2 == 0) return false; //因子是偶数
    }
    return true;
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t) {
        LL n;
        scanf("%lld", &n);
        if(check(n)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
        t--;
    }
    return 0;
}

第10个样例,Time Limit Exceeded,TLE了

输入3,由于 m * m <= 3连 m = 2都不满足,所以没经过判断,直接return true;了

🌼解法3    AC 60% 

投机取巧,骗分的方法,关键是快!只用了5分钟,分也不少

#include<iostream>
#include<cstdio> //scanf()
using namespace std;
typedef long long LL;
bool check(LL n)
{
    if(n == 2 || n == 4 || n == 6
       || n == 8 || n == 10 || n == 12 || n == 14
       || n == 16 || n == 18 || n == 20)
        return false;
    if(n == 3 || n == 5 || n == 9 || n == 15 || n == 21
       || n == 7 || n == 11 || n == 13 || n == 17 || n == 19)
        return true;
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t) {
        LL n;
        scanf("%lld", &n);
        if(check(n)) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
        t--;
    }
    return 0;
}

👊二,P9064 [yLOI2023] 苦竹林

P9064 [yLOI2023] 苦竹林 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

通过率 14%

难度:普及- 

 

1,先对数组a从小到大排序

2,尺取法,对连续的m个数遍历,每次更新Min

将Min与 (尺取的最后一个元素 - 尺取的第一个元素) 作比较

复杂度O(logn + n - m) ;logn表示log2n,是快排的复杂度

不会尺取法的看这里 

尺取法(图文解析、初学推荐)_小白小郑的博客-CSDN博客_尺取法

算法基础----尺取法(双指针)_jkaliang的博客-CSDN博客

1,尺取法是算法竞赛中,常用的优化技巧 

2,它比暴力枚举区间的效率高很多(特别是数据量大时,比如10^6),是一种高效枚举区间的方法,用于求取有一定限制的区间个数或最短区间 

3,本题中通过左边界右移,右边界右移的方法,找到满足区间,并用Min保留相减最小值(也就是题目中的ε

注意!!!OI赛制没有反馈,所以首先要自己想多点全面,偏门的案例

来验证代码,不然很可能就是信心满满 = AC 30%

先别急着提交,下面我展示5组测试样例 

10 6
1 8 26 33 41 17 102 27 11 5
22

6 2
1 4 9 12 13 15
1

5 3
1 2 3 4 5
2

6 4
1 7 8 3 4 6
4

10 4
120 240 550 1101 1199 2012 3312 5520 5523 5524
959

然后,,,第一次30%

🌼AC 30% 

#include<iostream>
#include<cstdio> //scanf()
#include<algorithm> //sort()
using namespace std;
int a[100010];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; ++i)
        scanf("%d", &a[i]); //读入数据
    sort(a, a + n);
    int Min = 1e8; //大坑
    for(int i = m - 1; i < n; ++i) {
        int j = i - (m - 1); //此时[j, i]刚好m个数
        if(a[i] - a[j] < Min)
            Min = a[i] - a[j];
    }
    cout<<Min;
    return 0;
}

思路很清晰啊,怎么会错呢?原来是第13行,初始最小值设置成1e8了

而题目原文却是:

所以,设置最小值,直接将题目中的范围粘贴过来好了。。

最大值一般设为负数

毕竟70%的样例都是大于1e8的

🌼AC  100% 

#include<iostream>
#include<cstdio> //scanf()
#include<algorithm> //sort()
using namespace std;
int a[100010];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; ++i)
        scanf("%d", &a[i]); //读入数据
    sort(a, a + n);
    int Min = 1e9; //大坑
    for(int i = m - 1; i < n; ++i) {
        int j = i - (m - 1); //此时[j, i]刚好m个数
        if(a[i] - a[j] < Min)
            Min = a[i] - a[j];
    }
    cout<<Min;
    return 0;
}

复杂度O(n * logn),也就是快排的复杂度,后面的O(n - m)相比O(nlogn)可忽略

👊三,P9065 [yLOI2023] 云梦谣

P9065 [yLOI2023] 云梦谣 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目有点长😅,通过率 6%

难度:普及+/提高

 

 

 

 

1,读入数据较多,我们用scanf不用cin 

2,点与点之间路径一样,都为1,我觉得用dfs比Dijkstra好做

所以就是纯dfs(后面证明dfs❌)

然鹅。。第一次就AC 5% ,而且我四个测试样例都对了,,,,

🌼AC  5%

#include<iostream>
#include<cstdio> //scanf()
using namespace std;
int a[3010][3010], book[3010][3010], b[3010][3010];
int fly[3010][3010], ans = 3000;
int n, m, k;

void dfs(int x, int y, int step)
{
    int next[4][2] = { //方向数组, 循环得到下一步坐标
            {-1, 0}, //上
            {1, 0}, //下
            {0, -1}, //左
            {0, 1}}; //右

    //dfs第一步: 遍历
    int tx, ty; //临时变量
    for(int i = 0; i < 4; ++i) {
        tx = x + next[i][0]; //0表示每行第1个元素
        ty = y + next[i][1]; //1表示每行第2个元素
        //越界
        if(tx < 1 || ty < 1 || tx > n || ty > m)
            continue; //跳出本次循环
        //非障碍物且未走过
        if(a[tx][ty] != 0 && book[tx][ty] != 1) {
            book[tx][ty] = 1; //标记
            dfs(tx, ty, step + 1); //递归
            book[tx][ty] = 0; //取消标记
        }
    }
    //找到目标
    if(x == n && y == m) {
        ans = min(ans, step); //更新
        return; //返回上一步
    }
}

int main()
{
    scanf("%d%d%d", &n, &m, &k);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            scanf("%d", &a[i][j]); //读入数据
    int r, t;
    for(int i = 0; i < k; ++i) {
        scanf("%d%d", &r, &t);
        fly[r][t] = 1; //可飞行
    }
    book[1][1] = 1; //初始已走过

    //得到全程走的最小值
    dfs(1, 1, 0);

    //得到飞的最小值
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
            if(fly[i][j] == 1) { //可飞
                if(a[i][j] != a[1][1]) //高度不同
                    dfs(i, j, 2);
                else //高度一样
                    dfs(i, j, 1);
            }
    cout<<ans;
    return 0;
}

 做了2小时才AC  5%,,,666

问题在哪呢?

1,dfs就不适合最短路(指数级复杂度),一般用Dijksta堆优化求单源最短路

2,漏了,如果到达不了,要输出"-1"的情况(补上这个就AC  10%)

3,代码里默认(1, 1)能飞,这是错误的

因为只是样例中的(1, 1)能飞,存在(1, 1)不能飞,走几步才能飞的情况

最后的

cout<<ans;

改成

if(ans == 3000) cout<<-1;
else cout<<ans;

就AC  10% 

好的,下一步考虑用stl的优先队列priority_queue优化Dijkstra 

这已经是最简单的做法了,如果能成,估计只需要60行

不行了,堆优化的Dijkstra虽然可以用stl的最大最小值优先队列(大小根堆),但是还得学习什么“链式前向星”(也就是静态的邻接表),《啊哈算法》里有讲邻接表,但是我想先放放,先把简单的,更易拿分的掌握了,两个月以内再回来克服它

2023/02/12     👆👆👆

10:27留坑 

👊四,P9066 [yLOI2023] 腐草为萤

P9066 [yLOI2023] 腐草为萤 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

难度:提高+/省选- 

题目就不放了,感兴趣的,自己去模拟 + 样例骗分吧

🌼AC  5%

#include <iostream>
using namespace std;
int a[110], b[110];
int main()
{
    int n;
    cin>>n;
    for(int i = 0; i < n; ++i)
        cin>>a[i]; //初始位置
    for(int i = 0; i < n; ++i)
        cin>>b[i]; //亮度
    for(int i = 1; i < n; ++i) {
        if(b[i] > b[i - 1])
            cout<<a[i]<<" "<<0;
        else if(b[i] == b[i - 1])
            cout<<0<<" "<<0;
        else
            cout<<0<<" "<<a[i - 1];
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux004之 vi和vim编辑器

vi、vim编辑器简介&#xff1a; 是linux中的文本编辑器&#xff0c;用来在linux系统中查看或编辑文本文件的命令&#xff0c; 相当于windows文本编辑器。 vi和vim的区别&#xff0c; vim是增强版&#xff0c; 功能相比vi是增强了。功能都查不多&#xff0c;用哪个都行&#xff…

数据库高并发和高可用方案

依旧主要参考沈剑大佬的多篇博文&#xff0c;以及数位网友的优秀分享&#xff0c;文末是完整参考。 1、高可用方案(HA&#xff0c;High Availability) 缓存是通过双写和双读主备、或者利用缓存的集群数据同步&#xff0c;故障自动转移来实现的 数据库的读是通过读写分离(MHA&am…

06-PS中的四种蒙版

Photoshop中的蒙版就是遮罩的意思&#xff0c;主要作用就是将其所在的图层&#xff0c;把不同的明暗度转化成相应的透明度。黑色为完全透明&#xff0c;灰色为半透明&#xff0c;白色为完全不透明。添加蒙版有便于灵活修改&#xff0c;不影响图层原貌。PS蒙版有四类&#xff1a…

【状态估计】基于二进制粒子群优化 (BPSO) 求解最佳 PMU优化配置研究【IEEE30、39、57、118节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Mybatis与微服务注册

目录 一&#xff0c;Springboot整合MybatisPlus 创建商品微服务子模块 二&#xff0c;SpringBoot整合Freeamarker 三、SpringBoot整合微服务 &gateway&nginx 整合微服务之商品服务zmall-product 创建并配置网关gateway服务 安装配置SwitchHosts 安装配置Windo…

【大数据hive】hive 函数使用详解

一、前言 在任何一种编程语言中&#xff0c;函数可以说是必不可少的&#xff0c;像mysql、oracle中&#xff0c;提供了很多内置函数&#xff0c;或者通过自定义函数的方式进行定制化使用&#xff0c;而hive作为一门数据分析软件&#xff0c;随着版本的不断更新迭代&#xff0c…

代码随想录第58天(动态规划):● 392.判断子序列 ● 115.不同的子序列

一、判断子序列 题目描述&#xff1a; 思路和想法&#xff1a; 这道题目还是最长公共子序列的拓展&#xff0c;只是这里进行删除的一定是t字符串&#xff0c;当不相等时&#xff0c;dp[i][j] dp[i][j - 1]&#xff1b;其余基本一致。当最长公共子序列个数等s.size()时&#x…

Leetcode力扣秋招刷题路-0050

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 50. Pow(x, n) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&am…

N字形变换-力扣6-java

一、题目描述将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a;P A H NA P L S I I GY I R之后&#xff0c;你的输出需要从左往右逐行读…

大神之路-起始篇 | 第11章.计算机科学导论之【数据压缩】学习笔记

欢迎关注「全栈工程师修炼指南」公众号点击 &#x1f447; 下方卡片 即可关注我哟!设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01;涉及 企业运维、网络安全、应用开发、物联网、人工智能、大数据 学习知识“ 花开堪折直须折&#xff0c;莫待无花空折…

【深度学习】卷积神经网络

1 卷积神经网络&#xff08;CNN&#xff09;可以做什么&#xff1f; 检测任务分类与检索超分辨率重构&#xff1a;将图像训练的更清晰医学任务等无人驾驶人脸识别 2 用GPU&#xff1a;图像处理单元 比CPU块一百倍以上 3 卷积神经网络与传统神经网络的区别 传统神经网络&…

从证券软件开发到大数据开发,薪资涨幅一倍多,我经历了什么?

点击上方 "大数据肌肉猿"关注, 星标一起成长点击下方链接&#xff0c;进入高质量学习交流群今日更新| 1052个转型案例分享-大数据交流群分享学习群一位同学的大数据转型经历&#xff0c;他17年毕业后培训了几个月去了杭州一家证券公司做外包&#xff0c;用的是古老的…

有限元分析学习一

系列文章目录 有限元分析学习一 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、有限元方法的简单介绍1.1 有限元的基础概念1.2 有限元软件发展历史1.3 有限元软件二、弹性力学的简单介绍2.1.…

【Spring】注解实现IOC操作,你理解了吗?

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《spring开发》 坚持做好每一步&#xff0c;幸运之神自然会驾凌在你的身上 专栏推荐&#xff1a;写文章刚刚起步&#xff0c;各个专栏的知识点后续会补充完善&#xff0c;不断更新好文&#xff0c;希望大 家支持一下。 专栏名字El…

jetson nano(ubuntu)安装ninja

文章目录安装环境安装环境 jetson nano 系统&#xff1a;4.6.1 安装re2c apt-get install re2c检查re2c是否安装成功 re2c --version ![在这里插入图片描述](https://img-blog.csdnimg.cn/847c19f15c2646bda44f6ae73b78509a.png#pic_center)下载ninja源代码 git clone https:/…

和在字节上班的兄弟聊过后,才知道原来年薪40W的测试有这么多?

最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的测试都这么有钱了吗&#xff1f; 前几天还有朋友说&#xff0c;从腾讯跳槽去了字…

(干货教程)在VSCode并使用chatgtp插件编写CC++语言程序

&#xff08;干货教程&#xff09;在VSCode并使用chatgtp插件编写CC语言程序 下载并安装VSCODE 第1步&#xff0c;下载VSCODE https://code.visualstudio.com/Download 第2步&#xff0c;安装VSCODE 安装过程较简单&#xff0c;这里省略。 安装好后效果如图&#xff1a…

(C语言)数据的存储

问&#xff1a;1. 数据类型有哪五大类&#xff1f;2. 数据类型的作用是什么与什么&#xff1f;3. 整型又可以具体分为哪五个&#xff1f;为什么字符char也归属于整型&#xff1f;4. 浮点型又可以具体分为哪两类&#xff1f;5. 构造类型就是什么&#xff1f;具体分为哪四类&…

2.4.8 PCIe——物理逻辑层——REFCLK

一、概述 pcie的参考时钟由板级输入&#xff0c;提供给IP内PHY层的PLL使用&#xff0c;由PLL产生core_clk和pipe_clk。 二、REFCLK产生方式 Serdes 所用时钟由 PHY 模块内的PLL生成&#xff0c;PLL的参考时钟可以由common clock&#xff08;外部背板提供&#xff09;、separ…

栈和队列的OJ练习题

前言 俗话说&#xff1a;熟能生巧&#xff0c;我们在学习完知识&#xff0c;一定要运用&#xff0c;不运用那么他过段时间就忘了&#xff0c;所以大家还是要认真的看一些题 (1)有效的括号 思路&#xff1a;我们可以用栈的知识 将左括号入栈&#xff0c;右括号出栈顶元素然后匹配…