1.牛牛的快递
题目来源:牛牛的快递——牛客网
测试用例
算法原理
本题的算法核心就是模拟,即模拟牛牛寄快递的操作来进行统计,这里需要特殊注意的就是如何计算超出起步价部分的价格,我们有两种方案:
1.使用库函数ceil默认向上取整直接计算超出起步价的部分
2.强制类型转化超出的部分后判断原来的数是否存在小数点,有则额外加一,没有则不做处理
//库函数向上取整
a = a - 1;
ret += 20;
//ceil函数向上取整
int c = ceil(a);
ret += c;
//强制类型转换判断小数点存在与否特殊处理
ret += 20;
double c = a - 1;
if(c - (int)c > 0)
{
ret += (int)c + 1;
}
else
{
ret += (int)c;
}
实战演练
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
double a;
char b;
cin>>a>>b;
int ret = 0;
//起步价
if(a <= 1)
{
ret += 20;
}
else
{
a = a - 1;
ret += 20;
//ceil函数向上取整
int c = ceil(a);
ret += c;
}
if(b == 'y')
{
//判断是否需要加急
ret += 5;
}
cout<<ret<<endl;
return 0;
}
2.Fibonacci数列
题目来源:Fibonacci数列——牛客网
测试用例
算法原理
本题属于斐波那契数列的扩展题目,这里思路是创建一个滚动数组,将输入的n放在该数组后两位数字的中间,判断距离两数字的距离,取出较小值即可,也是一种贪心的思想,即如果想让目标数变成斐波那契数列,就只能对其进行+1或者只进行-1的操作,不能同时+1和-1
实战演练
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin>>n;
int a = 0,b = 1,c = 1;
while(c < n)
{
//滚动数组模拟斐波那契数列
a = b;
b = c;
c = a + b;
}
//取出距离近的长度
cout<<min(c - n,n - b);
return 0;
}
3.杨辉三角
题目来源:杨辉三角——牛客网
测试用例
算法原理
本题需要熟知杨辉三角,即第一列均为1,从第三行第二列开始的元素等于同列上一行元素与上一行元素的前一个元素之和,还有一个难点就是如何创建杨辉三角,并且输出时注意格式,这里使用printf("%5d",dp[i][j]);可以很简单的解决
1.使用一个bq二维数组,直接从[1,1]的位置开始赋值为1,后以该位置为起始进行杨辉三角原理的操作,使用双层for循环,注意第二层循环的j一定程度上需要以来第一层循环的i
2.以同样的逻辑从头打印该数组即可
实战演练
#include <iostream>
using namespace std;
int dp[31][31];
int main()
{
int n = 0;
cin>>n;
dp[1][1] = 1;
for(int i = 2;i <= n;i++)
{
for(int j = 1;j <= i;j++)
{
//创建杨辉三角
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
}
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= i;j++)
{
//打印杨辉三角,注意输出格式
printf("%5d",dp[i][j]);
}
cout<<endl;
}
return 0;
}