洛谷P7892题解

本文详细解析了一道编程竞赛题目,涉及寻找围成固定面积像素格的最小栅栏周长问题。通过数学分析,证明了当长方形的长宽差值最小时,周长达到最小。解决方案是找到面积的平方根附近的因数,以构建最优化的长方形。代码实现中,首先计算面积的平方根,然后遍历找到第一个满足条件的因数,从而计算出最小周长,并判断是否符合给定限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目传送门

作为月赛的第一题,还是蛮简单的。

思路

首先,不要被样例所迷惑,样例给出的只是一种可行的方案,但并不是最优解,最优解应是围出一个 2 × 2 2\times2 2×2 的像素格,所需的栅栏数为 ( 2 + 1 ) × 2 + ( 2 + 1 ) × 2 = 12 (2+1)\times2+(2+1)\times2=12 (2+1)×2+(2+1)×2=12

接下来,因为题目中说明围成的像素格一定是一个长方形,所以可以根据长方形的周长与面积关系来做的,当这个长方形的面积一定时,构成这个长方形的不相邻的两条边差的绝对值越小,构成这个长方形的周长越小。

证明:
可以根据基本不等式 a + b > = 2 a b a+b>=2\sqrt{ab} a+b>=2ab 推出 ( a + b 2 ) 2 > = a b (\dfrac{a+b}{2})^2>=ab (2a+b)2>=ab,当且仅当 a = b a=b a=b 时等号成立。因为 a b ab ab 是已经确定的值了,所以当 a = b a=b a=b 时可以取到 a b ab ab 这一最小值,此时的 a + b a+b a+b 也一定是最小的即此时的周长也一定是是最小的,以此类推,也就推出了上面的结论。

知道了这些,剩下的也就比较简单了,可以先把输进来的面积 n n n 开方,然后找到离开方后的数最近的整数并且保证是 n n n 的因数即可求得最小的范围,最后求出周长即可。

具体看代码。

code

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int T;
long long l,n,m,ans;//保险
double f;//开方用
int main()
{
	scanf("%d",&T);
	while(T--){
		scanf("%lld%lld",&n,&m);
		f=sqrt(n);
		l=f;
		for(int i=l;i>=1;i--)//从最近的小于等于它的数往前找
			if(n%i==0){//可以构成长方形
				ans=(i+1)*2+(n/i+1)*2;
            			//i与n/i是构成面积为n的长方形的最短的两条不相邻的边
                    	//ans算最终结果
				break;//省时
			}
		if(ans>m)//判断
			cout<<"Miss"<<endl;
		else
			cout<<"Good"<<endl;
	}
	return 0;
}

完结撒花~~

### 关于 P1036 的 Java 解法 对于 P1036 题目,其核心在于模拟操作以及字符串处理。以下是基于题目描述的分析与解决方案。 #### 问题解析 该题的核心目标是对输入数据进行特定规则下的转换或计算。通常情况下,这类问题可以通过逐字符遍历或者利用数组来完成逻辑上的判断和更新[^3]。由于具体题目细节未提供,这里假设问题是关于某种模式匹配或简单算法的应用场景。 #### 实现方法 采用循环结构配合条件语句可以有效解决此类问题。下面是一个可能的实现方式: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 输入整数n表示测试组数 while (n-- > 0) { // 处理每组测试数据 String s = scanner.next(); // 初始化变量用于存储结果或其他中间状态 StringBuilder result = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 根据题目需求执行相应逻辑 if (c >= 'A' && c <= 'Z') { result.append((char)(c + 32)); // 转换大小写作为例子 } else { result.append(c); // 不变的情况 } } System.out.println(result.toString()); } scanner.close(); } } ``` 上述代码展示了如何通过读取多组输入并逐一处理的方式解决问题。此模板适用于许多涉及字符串变换的操作类题目[^4]。 #### 注意事项 当使用Java提交时需注意效率优化,尤其是面对大数据量的情况下。例如,在某些极端条件下,StringBuilder相比String能带来更优性能表现因为前者减少了不必要的对象创建开销[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值