P2118 [NOIP 2014 普及组] 比例简化

记录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 

\frac{a}{b}\geq \frac{A}{B}     👉        aB>=Ab

 \frac{a}{b}-\frac{A}{B}\geq 0    👉  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 的自然数,除了 1 和自身外无其他因数。
    • 判定方法(对正整数 n)
      • 暴力枚举:遍历 2 到 n​,若存在能整除 n 的数,则 n 不是质数。时间复杂度 O(n​),CSP-J 中 n≤109 时也能高效运行。
      • 优化技巧:先判断 n 是否为偶数,再枚举 3 到 n​ 的奇数,减少循环次数。
    • 考试场景:统计区间内质数个数、判断某个数是否为质数。
  2. 最大公约数(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)(注意:参数需为非负整数)。
    • 考试场景:分数化简、周期问题、分组分配问题。
  3. 因数与倍数
    • 因数枚举:遍历 1 到 n​,若 i 是 n 的因数,则 n/i 也是 n 的因数,可快速收集所有因数。
    • 倍数筛选:求 [1,n] 内某个数 k 的倍数个数,公式为 ⌊kn​⌋。
    • 考试场景:因数分解、统计因数个数、倍数求和问题。
  4. 奇偶性分析
    • 核心性质
      • 奇 + 奇 = 偶,偶 + 偶 = 偶,奇 + 偶 = 奇;
      • 奇 × 奇 = 奇,偶 × 任意数 = 偶;
      • 一个数的奇偶性由其除以 2 的余数决定(余数 0 为偶,1 为奇)。
    • 考试场景:硬币翻转问题、开关灯问题、判断操作可行性。
  5. 整除性质
    • 常用判定规则
      • 能被 2 整除:末位是偶数;
      • 能被 3/9 整除:各位数字之和能被 3/9 整除;
      • 能被 5 整除:末位是 0 或 5。
    • 考试场景:数字特征筛选、进制转换辅助判断。

二、 进制转换(必考基础)

CSP-J 常考十进制与二进制、八进制、十六进制的转换,核心是 “除基取余,逆序排列” 和 “按权展开求和”。

  1. 十进制转任意进制(d 进制)
    • 方法:将十进制数反复除以 d,记录余数,直到商为 0,最后将余数逆序排列。
    • 示例:十进制 10 转二进制 → 除 2 取余得余数序列 [0,1,0,1],逆序为 1010。
  2. 任意进制转十进制
    • 方法:按权展开求和,公式为 an​×dn+an−1​×dn−1+⋯+a0​×d0(ai​ 为 d 进制的每一位数字)。
    • 示例:二进制 1010 转十进制 → 1×23+0×22+1×21+0×20=10。
  3. 二进制特殊性质
    • 二进制是计算机底层进制,位运算(与、或、异或、移位)的基础;
    • 十进制数 n 的二进制位数为 ⌊log2​n⌋+1。
    • 考试场景:进制转换模拟题、位运算结合题、状态压缩辅助。

三、 排列组合与计数原理(入门级)

CSP-J 中排列组合考法简单,以加法原理、乘法原理为核心,避免复杂公式。

  1. 加法原理
    • 定义:完成一件事有 k 类方法,第 i 类有 mi​ 种方法,则总方法数为 m1​+m2​+⋯+mk​。
    • 适用场景:分类完成,各类方法互不干扰。
  2. 乘法原理
    • 定义:完成一件事需要 k 个步骤,第 i 步有 mi​ 种方法,则总方法数为 m1​×m2​×⋯×mk​。
    • 适用场景:分步完成,步骤依次依赖。
  3. 简单排列组合(选学,CSP-J 考频低)
    • 排列:从 n 个元素中选 k 个有序排列,公式为 Ank​=(n−k)!n!​;
    • 组合:从 n 个元素中选 k 个无序组合,公式为 Cnk​=k!(n−k)!n!​;
    • 考试场景:计数问题(如路径数统计、方案数统计)。

四、 数列与求和(模拟题常用)

主要考查等差数列、等比数列的求和公式,以及连续数的求和技巧,用于快速计算避免循环超时。

  1. 等差数列
    • 通项公式:an​=a1​+(n−1)d(a1​ 为首项,d 为公差);
    • 求和公式:Sn​=2n(a1​+an​)​=na1​+2n(n−1)d​。
    • 常见场景:1 到 n 的和(d=1),Sn​=2n(n+1)​。
  2. 等比数列(考频低)
    • 通项公式:an​=a1​qn−1(q 为公比,q=0);
    • 求和公式:Sn​=a1​1−q1−qn​(q=1)。
  3. 平方和 / 立方和(选学)
    • 平方和:12+22+⋯+n2=6n(n+1)(2n+1)​;
    • 立方和:13+23+⋯+n3=(2n(n+1)​)2。
    • 考试场景:快速计算区间和,替代循环累加,降低时间复杂度。

五、 几何基础(低频次,以平面几何为主)

CSP-J 几何题难度极低,主要考查坐标计算、距离公式,多结合模拟题出现。

  1. 平面直角坐标系
    • 点的坐标表示:(x,y),判断点是否在某区域内(如矩形、三角形);
    • 两点间距离公式:d=(x2​−x1​)2+(y2​−y1​)2​(若只需比较距离大小,可省略开平方,用平方值代替)。
  2. 图形面积计算
    • 矩形面积:长宽;
    • 三角形面积:底高;
    • 考试场景:图形覆盖问题、坐标模拟题。

六、 逻辑与集合(辅助算法设计)

这类知识不直接考公式,而是用于优化算法逻辑,是贪心、模拟题的底层思路。

  1. 逻辑运算
    • 与(&)、或(∣)、非(!)、异或(⊕)的规则,对应编程中的位运算和条件判断;
    • 异或性质:a⊕a=0,a⊕0=a,常用于交换变量、找唯一出现奇数次的数。
  2. 集合基础
    • 交集(同时属于两个集合的元素)、并集(属于任意一个集合的元素)、补集;
    • 考试场景:区间覆盖、元素去重、条件筛选问题。

七、 数学思维技巧(解题关键)

  1. 枚举与暴力的数学优化
    • 缩小枚举范围:如判定质数时枚举到 n​,而非 n−1;
    • 利用数学性质剪枝:如奇偶性、整除性排除无效方案。
  2. 递推与递归的数学模型
    • 斐波那契数列、阶乘的递推公式,转化为循环或递归代码;
    • 示例:斐波那契数列 f(n)=f(n−1)+f(n−2)(f(1)=1,f(2)=1)。

八、 避坑指南(CSP-J 易失分点)

  1. 数据溢出:计算乘法、阶乘时,若结果较大,需用 long long 类型(如 105×105=1010,超出 int 范围)。
  2. 整除与取模的区别:整数除法 / 会舍去小数部分,取模 % 求余数,负数取模需注意符号(如 −5%2=−1)。
  3. 浮点数精度问题:涉及小数比较时,避免直接用 ==,可通过差值的绝对值小于极小值(如 1e−8)判断相等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值