第八周作业

第一题

遍历一遍数组,判断树的高度即可,需要注意数组中有效数据的下标是从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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值