第一题
遍历一遍数组,判断树的高度即可,需要注意数组中有效数据的下标是从1开始,到n结束
#include<iostream>
using namespace std;
int GetApple(int a[], int height, int n)
{
int count = 0;
int max = height + 30;
for(int i = 1;i <= n;i++)
{
if(a[i]<=max)
count++;
}
return count;
}
int main()
{
int n, height, *a;
cin >> n;
a = new int[n+1];
for (int i=1;i<=n;i++) cin >> a[i];
cin >> height;
cout << GetApple(a, height, n) << endl;
delete [] a;
return 0;
第二题
这个题目的思路就是直接暴力穷举,从100到999判断是否存在一个三位数计算结果和输入的数字相等,在函数中的设计就是从100~999,依次计算其对应的5个数的和,再与函数的输入参数进行比较判断是否相等。
#include <iostream>
using namespace std;
int Magic(int m){
/***********begin************/
int sum = 0;
for(int i = 0;i < 10;i++)
{
for(int j = 0;j < 10;j++)
{
for(int k = 0;k < 10;k++)
{
sum=0;
sum += i * 122 + j * 212 + k * 221;
if(sum == m)
return i * 100 + j * 10 + k;
}
}
}
return -1;
/***********end**************/
}
int main()
{
int t,m;
cin >> t;
while(t--){
cin >> m;
int res = Magic(m);
if(res == -1) {
cout << "The sum you calculated is wrong!\n";
} else {
cout << "The number is " << res << endl;
}
}
}
第三题
这题注意,只是题目要求使用递归的写法来实现,实际生活中碰到这种问题不要用递归,依据题目要求用数组或直接几个变量就可以实现计算了,这种递归调用在return的递归我们称为尾递归,尾递归都是可以转化为循环过程的。
#include<iostream>
using namespace std;
int fib(int i)
{
//write your code here
if(i == 0 || i == 1)
return 1;
else
return fib(i-1)+fib(i-2);
}
int main()
{
for (int i = 0; i < 10; i++)
cout << fib(i) << endl;
return 0;
}
第四题
这个题目的解法通常来说就是贪心算法,题目已经给出了算法思路。解释一下就是将人送过去对岸之后,还需要一个人将氧气瓶送回来,因为就诞生了俩种贪心的思路,一种就是让第二快的人在对岸接应负责将氧气瓶送回来,一种就是让速度最快的人反复来回运送,这样一个周期内可以送两个人到对岸。在经过之前的考虑,我们就可以发现,在剩下3个人以上的时候,不断循环比较两种方法谁快就好,这样最后就只有两个情况,剩下3个人或2个人(初始人数大于1,如果初始人数等于1直接输出就好)。这两种情况题目已经给出所需要的事件,所以总共的算法思路就是下面这样
- 判断人数是否等于1,等于则直接输出
- 不断循环比较两种送法谁快,一次送走最慢的两个人直到最后剩下的人数小于等于3
- 依据剩下的人数执行最后一次运送
- 输出运送时间
#include <iostream>
using namespace std;
void sort(int a[], int n)
{
// sort a[]
// write your code here
int tmp=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i;j++)
{
if(a[j] < a[j + 1])
{
tmp=a[j];
a[j]=a[j + 1];
a[j + 1]=tmp;
}
}
}
}
int main()
{
// write your code here
int n;
cin >>n;
int arr[n]={0};
for(int i=0;i<n;i++)
{
cin >>arr[i];
}
sort(arr,n);
if(n == 1)
{
cout << arr[0];
return 0;
}
int p1 = arr[n - 1];
int p2 = arr[n - 2];
int sum = 0;
int index = 0;
//决策环节两个方案中最短的一个作为最优解
//考虑极限情况可以得到退出条件,以三个人和两个人作为参考
int t1,t2;
while(index < n - 3)//三个人和两个人的情况可以直接给出最快时间
{
//两个方案移动完毕之后最快的两个始终在A这边
t1 = 2 * p2 + p1 + arr[index];
t2 = arr[index] + arr[index + 1] + 2 * p1;
sum += min(t1, t2);
index += 2;
}
if(index == n - 3)
{
sum += p1 +p2 +arr[n-3];
}
else
{ //index == n-2
sum += p2;
}
cout <<sum;
return 0;
}