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

算法1111

文章目录

    • 1. 牛牛的快递
      • 1.1 思路
      • 1.2 源码
      • 1.3总结
    • 2. 最小花费爬楼梯
      • 2.1 思路
      • 2.2 源码
    • 3. 数组中两个字符串的最小距离
      • 3.1 思路
      • 3.2 源码
        • 3.2.1 第一遍
        • 3.2.2 第二遍
      • 3.3 总结


1. 牛牛的快递

牛牛的快递

1.1 思路

一道简单的模拟题

1.2 源码

#include <iostream>
using namespace std;
#include<cmath>int main() {float w;char ch;int ret = 0;cin >> w >> ch;if (w <= 1)ret += 20;else {ret += 20;w -= 1;ret += ceil(w);}if (ch == 'y')ret += 5;cout << ret << endl; return 0;
}

1.3总结

  1. cout << ret << endl; 要加endl,刷新一下缓冲区,不加过不了。
  2. 用了ceil向上取整函数。

2. 最小花费爬楼梯

最小花费爬楼梯

2.1 思路

经典的动态规划

  1. 确定状态表示:dp[i] 表示到达i位置时的最小花费。
  2. 确定状态转移方程:min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
  3. 填表顺序:从左向右
  4. 初始化:dp[0] = 0, dp[1] = 0
  5. 返回dp[n]

2.2 源码

#include<iostream>
#include<cstring>/*
描述
给定一个整数数组 cost  ,其中 cost[i] 是从楼梯第i 个台阶向上爬需要支付的费用,下标从0开始。
一旦你支付此费用,即可选择向上爬一个或者两个台阶。
*/
using namespace std;
const int MAXN = 100000 + 1;
int cost[MAXN];
int dp[MAXN];//手写分析过程:
//从大到小分析 对于第 i 阶,到顶需要的花费   dp[i] = cost[i] + min(dp[i + 1] , dp[i + 2])
//最后取 min(dp[0] , dp[1])
int main() {int n;cin >> n;for (int i = 0; i < n; ++i) {cin >> cost[i];}if (n == 1) {cout << cost[0] << endl;return 0;} else if (n == 2) {cout << min(cost[0], cost[1]);return 0;} else {memset(dp, 0, sizeof(dp));//dp初始化 对于最后一阶和倒数第二阶而言,他们需要的花费就是他们位置的costdp[n - 1] = cost[n - 1];dp[n - 2] = cost[n - 2];//从单数第三个开始,花费 就是 cost[i] + min(dp[i + 1] , dp[i + 2])//跳一步 和 跳两步 两种情况取花费少的情况for (int i = n - 3; i >= 0; --i) {dp[i] = cost[i] + min(dp[i + 1], dp[i + 2]);}//最后从“从0开始”和“从1开始” 两者选小的那个//实际上,二者表达的是 从0 、1开始之后的能实现的最低花费已经计算出来了//选择只是为了选择 “从哪个开始更优”cout << min(dp[0], dp[1]) << endl;}return 0;
}

3. 数组中两个字符串的最小距离

数组中两个字符串的最小距离

3.1 思路

  1. 暴力解法(双指针遍历数组)
  2. 优化暴力解法(一个指针,两个变量,一次循环遍历解决问题)
  3. 预处理的思想,不再用指针遍历,而是用变量存储。

3.2 源码

3.2.1 第一遍
#include <iostream>
using namespace std;
#include <vector>
#include <string>
#include <cstdlib>int main() 
{int n = 0;cin >> n;vector<string> strs;for (int i = 0; i < n; i++) {string str;cin >> str;strs[i] = str;}string str1, str2;cin >> str1 >> str2;int prev1, prev2;prev1 = prev2 = -1;int ret = 0;for (int i = 0; i < n; i++) {if (strs[i] == str1) {prev1 = i;if(strs[prev2] == str2)ret = prev1 - prev2;}else if (strs[i] == str2) {prev2 = i;if(strs[prev1] == str1)ret = prev1 - prev2;}}cout << abs(ret) << endl;return 0;
}
3.2.2 第二遍
#include<iostream>
#include<string>
using namespace std;int main() {int n;string s;string s1, s2;cin >> n;cin >> s1 >> s2;int prev1 = -1, prev2 = -1, ret = 0x3f3f3f3f;for (int i = 0; i < n; i++) {cin >> s;if (s == s1) {if (prev2 != -1)ret = min(ret, i - prev2);prev1 = i;}if (s == s2) {if (prev1 != -1)ret = min(ret, i - prev1);prev2 = i;}}if (ret == 0x3f3f3f3f) cout << -1 << endl;else cout << ret << endl;return 0;
}

3.3 总结

  1. 没有必要真的定义一个字符数组,字符数组的是很珍贵的,数组的意义让你能重复遍历,但是,咱们完全可以一次遍历结束。
  2. 注意“数组”不要越界。

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

相关文章:

  • 大牌印花图案设计网站工信部怎么查网站备案
  • 做网站需要走哪些程序建筑模板制作过程
  • 《POE 免布线:100 平米机房以太网温湿度便捷部署方案》
  • 做优化网站是什么意思浏览器下载WordPress文件
  • 纯静态网站制作开发公司对代理公司管理
  • 龙海网站开发如何建立和设置公司网站
  • 宜昌教育培训网站建设深圳宝安中学家长群
  • 做网站违反广告法wordpress全站转移
  • Ubuntu 怎么把树莓派内存卡备份制作成为镜像
  • 做淘客网站怎么教育局网站群建设方案
  • Ubuntu 24.04 安装开源WebRTC信令服务器
  • 滨州做微商城网站手机网站源码最好
  • 各态历经性-随机过程
  • 企业网站建设推广方案怎么写西双版纳网站建设
  • 企业微信消息推送系统设计:基于ES(事件溯源思想)解耦规则与任务架构
  • 基于 ESP32 与机器学习的智能语音家居控制系统
  • Ken的Java学习之路——Java中关于面向对象
  • 建设行业协会网站发展的建议crm客户管理系统模板
  • 做电子外贸网站免费vps
  • Java并发编程【JUC】【一】
  • 网站建设需要多久才能学会a963室内设计网
  • 做个手机网站多少钱怎样做网站标题优化
  • kubernetes(k8s)-Service
  • 深度学习基础知识总结(一):深入理解卷积(Convolution)
  • 宁波企业网站搭建特点wordpress 图片等比例缩放
  • 深圳电商网络网站建设什么样的网站可以做站内站
  • 网站建设怎样创建链接手机怎么在百度做网站
  • 麒麟aarch64架构离线部署python相关项目
  • 网站实例网站头部导航样式
  • 本地缓存:多线程问题。volatile