文章目录
-
- [1. 牛牛的快递](#1. 牛牛的快递)
- [2. 最小花费爬楼梯](#2. 最小花费爬楼梯)
- [3. 数组中两个字符串的最小距离](#3. 数组中两个字符串的最小距离)
1. 牛牛的快递
【链接】:牛牛的快递
解题思路:简单模拟题,主要是处理⼀下输⼊的问题。
cpp
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a;
char b;
cin>>a>>b;
int sum = 0;
if(b == 'y') sum += 5;
if(a <= 1)
{
sum += 20;
}
else
{
sum += 20;
// a -= 1;
// sum += ceil(a); // 向上取整函数ceil
double c = a - 1;
if(c - (int)c > 0) sum += (int)c + 1;
else sum += (int)c;
}
cout<<sum<<endl;
return 0;
}
// #include <iostream>
// using namespace std;
// int main() {
// double a;
// char b;
// cin>>a>>b;
// int sum = 0;
// if(b == 'y') sum += 5;
// sum += 20;
// a -= 1;
// while(a > 0)
// {
// a--;
// sum++;
// }
// cout<<sum<<endl;
// return 0;
// }
2. 最小花费爬楼梯
【链接】:最小花费爬楼梯
解题思路:动态规划,简单线性 dp。
cpp
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int cost[N];
int dp[N]; // dp[i]表示:爬到下标为i的台阶需要的最小费用
int 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. 数组中两个字符串的最小距离
【链接】:数组中两个字符串的最小距离
解题思路 :模拟 + 贪心:
◦ ⽤ prev1
标记 i
位置之前最近⼀次出现的第⼀个字符串的下标;
◦ ⽤ prev2
标记 i
位置之前最近⼀次出现的第⼆个字符串的下标。
cpp
#include <iostream>
#include <string>
#include <climits>
using namespace std;
int main()
{
int n;
string s1, s2, 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) // 去找前面最近的s2
{
if(prev2 != -1)
ret = min(ret, i - prev2);
prev1 = i;
}
else if(s == s2) // 去找前面最近的s1
{
if(prev1 != -1)
ret = min(ret, i - prev1);
prev2 = i;
}
}
//if(ret == 0x3f3f3f3f) cout<<-1<<endl;
if(prev1 == -1 || prev2 == -1) cout<<-1<<endl;
else cout<<ret<<endl;
return 0;
}