当前位置: 首页 > news >正文

【贪心】P2660 zzc 种田

题目

P2660 zzc 种田
在这里插入图片描述

分析&&代码

这道题目不难,但是代码实现值得研究。

#include<iostream>using namespace std;int main()
{int x, y; cin >> x >> y;if(x > y) swap(x,y); //保持x最小 int ret = 0;while(y != 0){while(x <= y) {ret += x * 4;y -= x;} if(y) swap(x,y);}cout << ret;return 0;
} 

这是我第一遍写出来的代码,我使用了while(x <= y)这样一个循环来计算y能除多少次x,并且计算最后y剩下多少。但是再进一步想一下,除法和取模运算刚好可以直接代替这个循环,为什么要写一个循环我也不知道我是咋想的。这个循环非常耗时,x、y的数据范围是1e16,只能过三个点,其他的全部TLE。而且数据范围这么大要开LL。

于是代码改进成了这样:

#include<iostream>using namespace std;
typedef long long LL;
int main()
{LL x, y; cin >> x >> y;if(x > y) swap(x,y); //保持x最小 LL ret = 0;while(y != 0){LL cnt = y / x; ret += cnt * x * 4;y %= x; if(y) swap(x,y);}cout << ret;return 0;
} 

再想想还有什么不足,似乎所有逻辑已经正确了,但是我们其实可以将代码写的更精炼。比如说比较x、y的大小然后交换这一步就可以优化。

下面是代码:

#include<iostream>using namespace std;
typedef long long LL;
LL ret;int main()
{LL x, y; cin >> x >> y;while(x && y){LL cnt = x / y;ret += cnt * y * 4;x %= y;swap(x, y);}	cout << ret;return 0;
} 

调试一下,假设 x=1,y=4,代码2一进程序就会比较 x、y 的大小,像现在这样 x 比 y 小就会交换 x、y 。但是对于优化后的代码,会直接进入循环,先计算出 cnt = 1/4 = 0,然后计算出 ret += 0 * 4 * 4,相当于ret不变,然后 1 %= 4 结果还是 1,最后一步交换 x、y。这就是优化后的代码可以不用手动交换 x、y。

递归写法:

#include <iostream>
using namespace std;
typedef long long LL;LL dfs(LL x, LL y, LL ret = 0) 
{if (x == 0 || y == 0) return ret;  // 终止条件LL cnt = x / y;ret += cnt * y * 4;x %= y;return dfs(y, x, ret);  // 交换x,y并递归
}int main() 
{LL x, y; cin >> x >> y;cout << dfs(x, y);return 0;
} 

注意:函数中的ret是默认参数,默认参数允许函数在调用时省略某些参数,编译器会自动使用预先定义的默认值。

http://www.dtcms.com/a/266862.html

相关文章:

  • Rust 中的返回类型
  • 指数分布的Python计算与分析
  • 微服务架构下的抉择:Consul vs. Eureka,服务发现该如何选型?
  • 简单 Python 爬虫程序设计
  • 递推|递归|分治
  • Python 办公实战:用 python-docx 自动生成 Word 文档
  • 【ROS2 自动驾驶学习】01-工具链的安装
  • 过滤器应用
  • MySQL分布式ID冲突详解:场景、原因与解决方案
  • Hive UDF 开发实战:MD5 哈希函数实现
  • 每周资讯 | Krafton斥资750亿日元收购日本动画公司ADK;《崩坏:星穹铁道》新版本首日登顶iOS畅销榜
  • 只出现一次的数字2
  • 暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
  • HarmonyOS免密认证方案 助力应用登录安全升级
  • 使用 DigitalPlat 免费搭配 Cloudflare Tunnel 实现飞牛系统、服务及 SSH 内网穿透教程
  • 计算机视觉---RealSense深度相机技术
  • 【C++类和对象解密】面向对象编程的核心概念(中)
  • Android Studio-Git的使用指南
  • 金融平衡术:创新与合规的突围之路
  • Word和Excel批量转PDF新方法,操作简单
  • 仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
  • RabbitMQ 高级特性之死信队列
  • VS CodeC51 单片机开发环境搭建
  • 猫头虎 AI工具分享:一个网页抓取、结构化数据提取、网页爬取、浏览器自动化操作工具:Hyperbrowser MCP
  • Web前端工程化
  • 网安系列【4】之OWASP与OWASP Top 10:Web安全入门指南
  • 一探 3D 互动展厅的神奇构造​
  • Querybook:一个开源大数据查询分析工具
  • Workflow or 自主智能体?网易CoreAgent如何打造企业级智能体平台新范式
  • OpenSearch添加仪表盘(elastic、es)