记录68
#include<bits/stdc++.h>
using namespace std;
int main(){
int A,B,L,t,n1=1,n2=1;
int min_=1e8+10;
//double max_=0;
cin>>A>>B>>L;
for(int i=1;i<=L;i++){
for(int j=1;j<=L;j++){
t=i*B-A*j;
int x=abs(t);
if(x<min_&&t>=0){
n1=i;
n2=j;
min_=x;
//max_=(i*1.0)/j;
}
}
}
cout<<n1<<' '<<n2;
return 0;
}
题目传送门
https://www.luogu.com.cn/problem/P2118
突破口
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有 1498 人,反对的有 902 人,那么赞同与反对的比例可以简单的记为 1498:902。
不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为 5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
思路
前置条件:a,b,A,B都大于0
👉 aB>=Ab
👉 aB-Ab>=0
转换为aB-Ab尽可能的小,并且aB-Ab要>=0
代码简析
#include<bits/stdc++.h>
using namespace std;
int main(){
int A,B,L,t,n1=1,n2=1;
int min_=1e8+10;
//double max_=0;
cin>>A>>B>>L;
for(int i=1;i<=L;i++){
for(int j=1;j<=L;j++){
t=i*B-A*j;
int x=abs(t);
if(x<min_&&t>=0){
n1=i;
n2=j;
min_=x;
//max_=(i*1.0)/j;
}
}
}
cout<<n1<<' '<<n2;
return 0;
}
int A(支持人数),B(反对人数),L(上限),t(存aB-Ab),n1=1(公式中a),n2=1(公式中b);
int min_=1e8+10;(最小的差值)
for(int i=1;i<=L;i++){} 👉 寻找式子中的a
for(int j=1;j<=L;j++){} 👉 寻找式子中的b
t=i*B-A*j; 👉 即为aB-Ab
int x=abs(t); 👉 存aB-Ab差的绝对值
if(x<min_&&t>=0){} 👉 差值最小,并且差值得大于0(见思路公式转换)
n1=i; 👉 存下来a的值
n2=j; 👉 存下来b的值
min_=x; 👉 更新最小的差
补充
CSP-J 必备数学知识清单(分条梳理)
CSP-J 中的数学知识主要服务于模拟、枚举、贪心、动态规划等基础算法,难度集中在小学到初中数学范畴,核心是灵活运用公式和性质解决编程问题。以下按知识模块分条整理,条理清晰且贴合考试高频考点。
一、 数论基础(CSP-J 最高频模块)
数论是字符串、模拟题之外的核心考点,常考因数、倍数、质数、最大公约数 / 最小公倍数等内容。
- 质数(素数)判定
- 定义:大于 1 的自然数,除了 1 和自身外无其他因数。
- 判定方法(对正整数 n)
- 暴力枚举:遍历 2 到 n,若存在能整除 n 的数,则 n 不是质数。时间复杂度 O(n),CSP-J 中 n≤109 时也能高效运行。
- 优化技巧:先判断 n 是否为偶数,再枚举 3 到 n 的奇数,减少循环次数。
- 考试场景:统计区间内质数个数、判断某个数是否为质数。
- 最大公约数(GCD)与最小公倍数(LCM)
- 核心公式:对正整数 a,b,有 GCD(a,b)×LCM(a,b)=a×b。
- GCD 求解:用欧几里得算法(辗转相除法),公式为 GCD(a,b)=GCD(b,amodb),直到 b=0,此时 a 就是 GCD。
- C++ 实现:可手写函数,或用
<algorithm>头文件中的__gcd(a,b)(注意:参数需为非负整数)。- 考试场景:分数化简、周期问题、分组分配问题。
- 因数与倍数
- 因数枚举:遍历 1 到 n,若 i 是 n 的因数,则 n/i 也是 n 的因数,可快速收集所有因数。
- 倍数筛选:求 [1,n] 内某个数 k 的倍数个数,公式为 ⌊kn⌋。
- 考试场景:因数分解、统计因数个数、倍数求和问题。
- 奇偶性分析
- 核心性质
- 奇 + 奇 = 偶,偶 + 偶 = 偶,奇 + 偶 = 奇;
- 奇 × 奇 = 奇,偶 × 任意数 = 偶;
- 一个数的奇偶性由其除以 2 的余数决定(余数 0 为偶,1 为奇)。
- 考试场景:硬币翻转问题、开关灯问题、判断操作可行性。
- 整除性质
- 常用判定规则
- 能被 2 整除:末位是偶数;
- 能被 3/9 整除:各位数字之和能被 3/9 整除;
- 能被 5 整除:末位是 0 或 5。
- 考试场景:数字特征筛选、进制转换辅助判断。
二、 进制转换(必考基础)
CSP-J 常考十进制与二进制、八进制、十六进制的转换,核心是 “除基取余,逆序排列” 和 “按权展开求和”。
- 十进制转任意进制(d 进制)
- 方法:将十进制数反复除以 d,记录余数,直到商为 0,最后将余数逆序排列。
- 示例:十进制 10 转二进制 → 除 2 取余得余数序列 [0,1,0,1],逆序为 1010。
- 任意进制转十进制
- 方法:按权展开求和,公式为 an×dn+an−1×dn−1+⋯+a0×d0(ai 为 d 进制的每一位数字)。
- 示例:二进制 1010 转十进制 → 1×23+0×22+1×21+0×20=10。
- 二进制特殊性质
- 二进制是计算机底层进制,位运算(与、或、异或、移位)的基础;
- 十进制数 n 的二进制位数为 ⌊log2n⌋+1。
- 考试场景:进制转换模拟题、位运算结合题、状态压缩辅助。
三、 排列组合与计数原理(入门级)
CSP-J 中排列组合考法简单,以加法原理、乘法原理为核心,避免复杂公式。
- 加法原理
- 定义:完成一件事有 k 类方法,第 i 类有 mi 种方法,则总方法数为 m1+m2+⋯+mk。
- 适用场景:分类完成,各类方法互不干扰。
- 乘法原理
- 定义:完成一件事需要 k 个步骤,第 i 步有 mi 种方法,则总方法数为 m1×m2×⋯×mk。
- 适用场景:分步完成,步骤依次依赖。
- 简单排列组合(选学,CSP-J 考频低)
- 排列:从 n 个元素中选 k 个有序排列,公式为 Ank=(n−k)!n!;
- 组合:从 n 个元素中选 k 个无序组合,公式为 Cnk=k!(n−k)!n!;
- 考试场景:计数问题(如路径数统计、方案数统计)。
四、 数列与求和(模拟题常用)
主要考查等差数列、等比数列的求和公式,以及连续数的求和技巧,用于快速计算避免循环超时。
- 等差数列
- 通项公式:an=a1+(n−1)d(a1 为首项,d 为公差);
- 求和公式:Sn=2n(a1+an)=na1+2n(n−1)d。
- 常见场景:1 到 n 的和(d=1),Sn=2n(n+1)。
- 等比数列(考频低)
- 通项公式:an=a1qn−1(q 为公比,q=0);
- 求和公式:Sn=a11−q1−qn(q=1)。
- 平方和 / 立方和(选学)
- 平方和:12+22+⋯+n2=6n(n+1)(2n+1);
- 立方和:13+23+⋯+n3=(2n(n+1))2。
- 考试场景:快速计算区间和,替代循环累加,降低时间复杂度。
五、 几何基础(低频次,以平面几何为主)
CSP-J 几何题难度极低,主要考查坐标计算、距离公式,多结合模拟题出现。
- 平面直角坐标系
- 点的坐标表示:(x,y),判断点是否在某区域内(如矩形、三角形);
- 两点间距离公式:d=(x2−x1)2+(y2−y1)2(若只需比较距离大小,可省略开平方,用平方值代替)。
- 图形面积计算
- 矩形面积:长宽;
- 三角形面积:底高;
- 考试场景:图形覆盖问题、坐标模拟题。
六、 逻辑与集合(辅助算法设计)
这类知识不直接考公式,而是用于优化算法逻辑,是贪心、模拟题的底层思路。
- 逻辑运算
- 与(&)、或(∣)、非(!)、异或(⊕)的规则,对应编程中的位运算和条件判断;
- 异或性质:a⊕a=0,a⊕0=a,常用于交换变量、找唯一出现奇数次的数。
- 集合基础
- 交集(同时属于两个集合的元素)、并集(属于任意一个集合的元素)、补集;
- 考试场景:区间覆盖、元素去重、条件筛选问题。
七、 数学思维技巧(解题关键)
- 枚举与暴力的数学优化
- 缩小枚举范围:如判定质数时枚举到 n,而非 n−1;
- 利用数学性质剪枝:如奇偶性、整除性排除无效方案。
- 递推与递归的数学模型
- 斐波那契数列、阶乘的递推公式,转化为循环或递归代码;
- 示例:斐波那契数列 f(n)=f(n−1)+f(n−2)(f(1)=1,f(2)=1)。
八、 避坑指南(CSP-J 易失分点)
- 数据溢出:计算乘法、阶乘时,若结果较大,需用
long long类型(如 105×105=1010,超出int范围)。- 整除与取模的区别:整数除法
/会舍去小数部分,取模%求余数,负数取模需注意符号(如 −5%2=−1)。- 浮点数精度问题:涉及小数比较时,避免直接用
==,可通过差值的绝对值小于极小值(如 1e−8)判断相等。



956

被折叠的 条评论
为什么被折叠?



