【day02】牛牛的快递 | 最小花费爬楼梯 | 数组中两个字符串的最小距离
1.牛牛的快递
题目链接:牛牛的快递_牛客题霸_牛客网
算法思路:
模拟:分情况讨论即可。(ceil函数)
#include <bits/stdc++.h>using namespace std;#define int long longsigned main()
{double a;char b;cin >> a >> b;int ret = 0;if(a <= 1) ret += 20;else{ret += 20;a -= 1;ret += ceil(a);}if(b == 'y') ret += 5;cout << ret << endl;return 0;
}
2.最小花费爬楼梯
题目链接:最小花费爬楼梯_牛客题霸_牛客网
算法思路:
简单线性dp。
#include <bits/stdc++.h>using namespace std;#define int long longconst int N = 1e5 + 10;
int dp[N];
int cost[N];signed main()
{int n;cin >> n;for(int i = 0;i < n;i ++) cin >> cost[i];for(int i = 2;i <= n;i ++){dp[i] = min(dp[i - 1] + cost[i - 1] , dp[i - 2] + cost[i - 2]);}cout << dp[n] << endl;return 0;
}
3.数组中两个字符串的最小距离
算法思路:
⼩贪⼼,或者是⼩dp:
⽤ prev1 标记 i 位置之前最近⼀次出现的第⼀个字符串的下标;
⽤ prev2 标记 i 位置之前最近⼀次出现的第⼆个字符串的下标。
#include <bits/stdc++.h>using namespace std;#define int long longsigned main()
{int n;string s1 , s2;string s;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;
}