csp-j各知识点对应的洛谷练习题号(坑题小集)

数学应用

P1348 Couple number

这里给大家演示一下平方差公式化简的步骤
(a+b)(a-b) =a(a-b)+b(a-b) =a^2-ab+ab-b^2 =a^2-b^2
∴ 由此式反推回去
a^2-b^2=(a+b)(a-b)
a+b与a-b奇偶性一定相同
证明:
a+b-(a-b)=a+b-a+b=2b
∵b是整数,∴2b一定是偶数
∴a+b与a-b奇偶性相同
那么,出现Couple number数有两种情况:a+b为奇数或a+b为偶数
如果a+b是奇数,奇数乘奇数一定还得奇数,这是情况①
如果a+b是偶数,偶数乘偶数一定是4的倍数,这是情况②
综上所述,Couple number必须符合是4的倍数或是奇数中的一种
那么只需要枚举Couple number,时间复杂度为O(n1-n2)
题目保证n1-n2<1e7,所以不用担心TLE
----by 洛谷 张文奕

https://www.luogu.com.cn/problem/P1348

模拟

P2628 冒险岛

在windows和linux系统中,getline的表现是不一样的。虽然模糊的知道这个知识点,但不求甚解的结果跟完全不知道也没有什么不同。smallC233这位洛谷用户在题解中提到: getline 是遇到 \n 停止,而洛谷生成的输入数据中,换行是 \r\n 。在 Windows 系统下, \r\n 被读取的时候,会被系统自动换化成 \n 。也就是说,在输入文件中的 \r\n 被 getline 到 string 之后,其实就只有一个 \n 了。但评测机使用的是 Linux 系统,\r\n 不会被处理,所以 \r 会被读入字符串当中,字符串长度因此会多一位,导致出错。因此我们需要特判一下:

getline(cin,s);
int len=s.size()-1;        //len是字符串总长度
if(s[len]=='\r'){len--;}    //如果最后一位是'\r'就把它砍掉

另外,题目中的奖励制度明确了需要连续3个箭头(含当前格),但惩罚制度并没有明确这个要求,实际上,也是需要连续3个星号(含当前格)时,才触发惩罚。

https://www.luogu.com.cn/problem/P2628

递推

P1358 扑克牌

自己用递推的时候错了两个点,最后参考题解,利用杨辉三角形解决的,初中的知识在几十年后终于派上了用场。也是有始有终~

https://www.luogu.com.cn/problem/P1358

但题目中的有一部分没怎么看懂,虽然题解也对剩余纸牌进行了判断,数量不足就break,但并没有对sum重新进行赋值,而输出答案却变成了0,而不是中途半端的值。打印了数组看了一下,发现问题的答案在数组里,当坐标x小于y的时候,数组中的值都是“0”,乘上之后,答案就自然变为了“0”,非常的巧妙。

#include<iostream>
using namespace std;
int n,m,tmp,sum=1;
int res[10005][105];

int main(){
    res[0][0]=1;
    cin >> n >> m;
    for(int i=1;i<=10001;i++){
        for(int j=0;j<=101;j++){
            res[i][j]=(res[i-1][j-1]+res[i-1][j])%10007;
        }
    }
    //杨辉三角形输出演示
    for(int i=0;i<20;i++){
        for(int j=0;j<20;j++){
            cout << " " << res[i][j];
        }
        cout << endl;
    }
    //演示结束
    for(int i=0;i<m;i++){
        cin >> tmp;
        sum=sum*res[n][tmp]%10007; 
        n-=tmp;
        if(n<0)break;
    }
    cout << sum;
}

前缀和

https://www.luogu.com.cn/problem/P1599

动态规划

P1115 最大子段和

https://www.luogu.com.cn/problem/P1115 

P1164 小A点菜

https://www.luogu.com.cn/problem/P1164

1359 租用游艇

https://www.luogu.com.cn/problem/P1359

标签: c++

移动端可扫我直达哦~

推荐阅读

thumbnail 2025-09-05

P1088 [NOIP 2004 普及组] 火星人与康托展开

变进制数我们的目标是把全排列转化成一个变进制数,以方便我们进行加法。对于第 i 根手指,它有 n−i+1 种选择,根据位值原理,要想让每个数对应一个全排列,就要让这一位数是 n−i+1 进制的。那么,整个过程分为三步:将火星数变成变进...

少儿编程 c++

thumbnail 2025-09-04

用C++求全排列的几种方法

交换法交换法的优点:不需要额外的标记数组,空间复杂度更低,代码更简洁。需要注意的是,这个方式生成的全排列并非是字典序。#include <iostream> #include <algorithm> using...

少儿编程 c++

thumbnail 2025-08-30

关于 c++ 中的 unique() 函数

unique() 是C++标准库中一个非常实用的算法,用于去除相邻的重复元素。使用它之前需要先引入必须包含的头文件:#include<algorithm>基本语法#include <algorithm> // ...

少儿编程 c++

thumbnail 2025-08-30

lower_bound 为什么结果要减去数组名

lower_bound 结果减去数组名是为了将返回的迭代器(指针)转换为数组下标(索引)。lower_bound 返回的是一个迭代器(对于数组来说就是指针),指向找到的元素位置。int arr[] = {10, 20, 30, 40,...

少儿编程 c++

thumbnail 2025-08-25

c语言中的 fstream 与 freopen 区别

fstream(C++风格)和 freopen(C风格)都是用于文件输入/输出的工具,但它们在设计理念、用法和灵活性上有根本性的区别。核心概览 特性fstream (C++)freopen (C)所属语言标准C++C编程范式面向对象 ...

少儿编程 c++

thumbnail 2025-08-24

c++面向对象--类的学习笔记

在学习类之前,相信很多人跟博主一样,已经学习过结构体。在 C++ 中,struct 和 class 的区别非常小,几乎只是默认访问权限的不同。默认访问权限/继承权限:struct 的默认成员访问权限和默认继承方式都是 public。c...

少儿编程 c++

thumbnail 2025-08-23

栈上数组和堆上数组

对比表格 特性栈上数组堆上数组内存位置栈内存堆内存声明方式int arr[10];int* arr = new int[10];生命周期所在作用域结束自动释放需要手动delete[]释放大小确定编译时确定(必须是常量)运行时确定(可以...

少儿编程 c++

thumbnail 2025-08-03

方格取数与传纸条-双人网格路径问题

24年在洛谷刷刷题,遇到过一个双人路径问题,P1004 [NOIP 2000 提高组] 方格取数,题解的4维数组对于博主这样一个菜鸟,实在难以理解,于是就搁置了。然而25年的时候又遇到了P1006 [NOIP 2008 提高组] 传纸...

少儿编程 c++

thumbnail 2025-07-16

二分查找无解为什么用 n+1

二分查找是一种在有序数组中查找特定元素的高效算法。它的基本思想是通过不断地将查找范围减半来快速定位目标元素。然而,在某些情况下,二分查找可能无法找到目标元素,这时就需要处理无解的情况。关于二分查找无解时使用 n+1 的原因,可以从以下...

少儿编程 c++

thumbnail 2025-07-16

关于后缀和的哨兵值

在二分查找结合后缀和(Prefix Sum / Suffix Sum)的问题中,哨兵值(Sentinel Value) 的作用是:处理边界情况(如所有元素都不满足条件时)。防止数组越界访问(如 sum[-1] 或 sum[n+1])。...

少儿编程 c++