2021/7/20

8:30-9:00 学习打卡

9:30-13:00 二招刷题

15:00-19:00 二招刷题

1,a题

给你一个长度为N的序列,现在需要把他们切割成M个子序列(所以每一份都是连续的),使得每个子序列和均不超过某个值X

二分思想做这题,将值相加小于此中点值时存入,大于后次数加一,如果次数小了就是值大了向下找,反之向上找。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    long long int a[100000],m,n,i,j,l=0,r=0,mm,s=0,sum,max,ss;
    scanf("%lld%lld",&n,&m);
    for(i=0;i<n;i++)
    {
        scanf("%lld",&a[i]);
        if(l<a[i]) l=a[i];
        r+=a[i];
    }
    while(l<=r){
        mm=(l+r)/2;
        sum=1;
        for(i=0,s=0;i<n;i++){//查看是否小于中间值
            if(s+a[i]<=mm){
                s+=a[i];
            }
            else{
                sum++;
                s=a[i];
            }
        }
        if(sum>m){//大于代表最值在上
            l=mm+1;
        }
        else{
            ss=mm;
            r=mm-1;
        }
    }
    printf("%lld",ss);
}

2。b题

整个寒假共有N 天. 对于第 i (1 ≤ i ≤ N)天, Alice将会从如下三项活动中选出一项作为这天的主要项目

  • A: 溜嘉然小姐的《猫中毒》. 可以获得 ai 的快乐值.
  • B: 溜珈乐的《红色高跟鞋》. 可以获得 bi 的快乐值.
  • C: 溜一个魂的《超级敏感》. 可以获得 ci 的快乐值.

牛子爷觉不喜欢两天都做同样的事情,所以任何相邻两天的项目都不能重复.

请帮牛子爷制定一个暑假计划可使牛子爷在整个假期中能获得最大的快乐值,输出这个最大的快乐值

动态规划题,因为不能与前一个相等,就只需要找另外两个的动态值相加,持续加到n即可。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    long int a[100010][3],b[100010][3],i,j,n,max;
    scanf("%ld",&n);
    for(i=1;i<=n;i++){
        scanf("%ld%ld%ld",&a[i][0],&a[i][1],&a[i][2]);
    }
    b[1][0]=a[1][0];
    b[1][1]=a[1][1];
    b[1][2]=a[1][2];
    for(i=2;i<=n;i++){
    //将此与前一个动态值相加。获得当前动态值
        b[i][0]=a[i][0]+(b[i-1][1]>b[i-1][2]?b[i-1][1]:b[i-1][2]);
        b[i][1]=a[i][1]+(b[i-1][0]>b[i-1][2]?b[i-1][0]:b[i-1][2]);
        b[i][2]=a[i][2]+(b[i-1][1]>b[i-1][0]?b[i-1][1]:b[i-1][0]);
    }
    max=b[n][0]>b[n][1]?b[n][0]:b[n][1];
    max=max>b[n][2]?max:b[n][2];
    printf("%ld",max);
}

3.c题,d题

现有 N 个石头,分别标记为 1, 2, ..., N。对于每一个石头 i (1 ≤ i ≤ N)有一个高度记为 hi

现有一只青蛙在石头 1 上,它想通过一些跳跃到达石头 N

  • 如果青蛙此时在石头 i 上,那么它可以跳到石头 i + 1, 石头 i + 2, ... ,石头 i + K 中的某一个上。这次跳跃需要消耗它 |hi - hj| 能量,其中 j 为青蛙跳跃到达的石头序号。

找到青蛙到达石头 N 消耗能量可能的最小值。

动态规划题,d题正常做,c题因为有了k次跳跃选项,所以相当于跳跃选项多次比较,获得答案

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    long int a[100010],b[100010],i,j,n,m,x,y,min;
    scanf("%ld%ld",&n,&m);
    for(i=1;i<=n;i++){
        scanf("%ld",&a[i]);
    }
    b[1]=0;
    b[2]=abs(a[2]-a[1]);
    for(i=3;i<=n;i++)//遍历动态值
    {
        min=b[i-1]+abs(a[i]-a[i-1]);
        for(j=2;i-j>0&&j<=m;j++)//多次比较动态值大小
        {
            y=b[i-j]+abs(a[i]-a[i-j]);
            min=min>y?y:min;
        }
        b[i]=min;
    }
    printf("%ld\n",b[n]);
}

4.E题

背包问题,当前无动态值,将此项前一个值的距离的动态值加一赋给此值,如果有值将此值与当前操作比大小,大的覆盖此值。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main()
{
    int s[5000]={0},a[3],n,i,max,j;
    scanf("%d%d%d%d",&n,&a[0],&a[1],&a[2]);
    memset(s,-1,sizeof(s));
    s[0]=0;
    for(j=0;j<3;j++)//物品的遍历
    for(i=a[j];i<=n;i++){//动态值的遍历
           if(s[i-a[j]]!=-1)//此值是否有值
        if(s[i]<s[i-a[j]]+1){//无值将进行比较
            s[i]=s[i-a[j]]+1;
        }
    }
    printf("%d",s[n]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值