Day 2
目录
- 1.牛牛的快递(pass)
- 1.1解析
- 1.2代码
- 2.最小花费爬楼梯 (pass)
- 2.1解析
- 2.2代码
- 3.数组中两个字符串的最小距离 (pass)
- 3.1解析
- 3.2代码
1.牛牛的快递(pass)
牛牛的快递
1.1解析
1.2代码
#include <iostream>
#include <cmath>
using namespace std;
int main() {
float a;
char b;
cin>>a>>b;
int price=0;//结果
if(b=='y')price+=5;//加急
if(a<=1.0) cout<<(price+20);
else
{
price+=20;//先加上起步价
a--;
//price+=ceil(a);//向上取整函数
if(a-(int)a>0)price+=(int)a+1;
else price+=(int)a;
cout<<price;
}
}
2.最小花费爬楼梯 (pass)
最小花费爬楼梯
技能:线性dp
2.1解析
2.2代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n=0;
cin>>n;
vector<int> cost(n);
for(int i=0;i<n;i++)
cin>>cost[i];
vector<int> dp(n+1);
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];
}
3.数组中两个字符串的最小距离 (pass)
数组中两个字符串的最小距离
技能:哈希、双指针、字符串
3.1解析
3.2代码
//运行超时了
//O(N^2)
#include <iostream>
#include<vector>
#include<limits.h>
using namespace std;
int main() {
int n=0;
cin>>n;
string str1,str2;
cin>>str1>>str2;
vector<string> strs(n);
for(auto& str:strs) cin>>str;
int ret=INT_MAX;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if((strs[i]==str1&&strs[j]==str2)||(strs[i]==str2&&strs[j]==str1))
ret=min(ret,abs(i-j));
}
if(ret==INT_MAX)cout<<-1;
else
cout<<ret;
}
//优化->时间复杂度:O(N)
#include <iostream>
#include<vector>
#include<limits.h>
using namespace std;
int main() {
int n=0;
cin>>n;
string str1,str2;
cin>>str1>>str2;
vector<string> strs(n);
for(auto& str:strs) cin>>str;
int prev1=-1,prev2=-1,ret=INT_MAX;
for(int i=0;i<n;i++)
{
if(strs[i]==str1)//向前找最近的str2
{
prev1=i;
if(prev2!=-1)
ret=min(ret,prev1-prev2);
}
if(strs[i]==str2)//向前找最近的str1
{
prev2=i;
if(prev1!=-1)
ret=min(ret,prev2-prev1);
}
}
if(prev1==-1||prev2==-1)//判断str1/str2是否存在
cout<<-1;
else
cout<<ret;
}