hdu 2001 保留位

按有效位输出是 setprecision,按小数位数输出也是setprecision,但到底是谁取决于fixed。

const double value = 12.3456789

cout << setprecision(4) << value << endl; // 改成4精度,所以输出为12.35

cout << fixed << setprecision(4) << value << endl; // 加了fixed意味着是固定点方式显示,所以这里的精度指的是小数位,输出为12.3457

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(){
	double x1,y1,x2,y2,d;
	while(cin>>x1>>y1>>x2>>y2){
		d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
		cout<<fixed<<setprecision(2)<<d<<endl;
	}return 0;
}


HDU 3043 是一道编程竞赛题目,题名为 "Integer Break"。该问题要求将一个正整数拆分成若干个至少为1的正整数之和,并使得这些整数的乘积最大化。解决此类问题通常采用动态规划或数学推导的方式[^1]。 ### 动态规划解法 定义状态 `dp[n]` 表示整数 `n` 拆分后的最大乘积。状态转移方程如下: - 初始条件:`dp[2] = 1` - 状态转移:对于每个 `i` 从 `3` 到 `n`,遍历所有可能的拆分点 `j`(从 `1` 到 `i - 1`),计算 `max(j * (i - j), j * dp[i - j])`,并更新 `dp[i]` 的最大值。 以下是一个 Python 实现: ```python def integerBreak(n): dp = [0] * (n + 1) dp[2] = 1 for i in range(3, n + 1): for j in range(1, i): dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])) return dp[n] ``` ### 数学优化方法 通过观察可以发现,当 `n >= 5` 时,尽可能多地使用数字 `3` 能够得到最大的乘积。具体规则如下: - 当 `n % 3 == 0`,则全部拆分为 `3`。 - 当 `n % 3 == 1`,则用一个 `4` 替代两个 `3`。 - 当 `n % 3 == 2`,则保留一个 `2`。 例如: - `n = 10` 可以拆分为 `3 + 3 + 4`,乘积为 `3 * 3 * 4 = 36`。 - `n = 11` 可以拆分为 `3 + 3 + 3 + 2`,乘积为 `3 * 3 * 3 * 2 = 54`。 以下是基于数学方法的实现: ```python def integerBreak(n): if n == 2: return 1 if n == 3: return 2 product = 1 while n > 4: product *= 3 n -= 3 product *= n return product ``` ### 时间复杂度分析 - 动态规划方法的时间复杂度为 $O(n^2)$,因为需要两层循环。 - 数学方法的时间复杂度为 $O(n)$,但实际执行效率更高,因为它只涉及简单的除法和取余操作。 ### 应用场景 这类问题在算法设计中常用于测试贪心策略与动态规划的对比,同时也适用于组合优化中的资源分配问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值