NOIP2018 提高组 Day1 题解

本文提供了NOIP2018提高组第一天比赛的三道题目解题思路。T1题利用滚动数组解决;T2题为DP背包问题,通过DFS+DP实现;T3题采用树形DP和二分查找找到最短长度最长的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今年原地起爆,没进复赛,看别的dalao码代码各种AK虐场心痒痒,来写个题解

Day2还在肝,就先写Day1吧……


T1

NOIP2013年原题,用个滚动数组就能水过去了……(不用应该也行吧)

做法大概是从头开始扫,记录每个位置的深度,然后读入一个深度,如果后面的更深就需要多填 后面的深度−-前面的深度 次

#include<bits/stdc++.h>
using namespace std;
int n,a,b;
long long ans;
int main()
{
   
   
    scanf("%d%d",&n,&b);
    ans=b;
    for(int i=1;i<n;i++)
    {
   
   
        scanf("%d",&a);
        if(a>b) ans+=a-b;
        b=a;
    }
    printf("%lld",ans);
    return 0;
}

T2

明显的DP背包题,想不到的话使用DFS+DP可以获得65(洛咕数据)的好成绩

把面值排个序,从头向后扫,如果f[a[i]]=1f[a[i]]=1f[a[i]]=1则表示a[i]a[i]a[i]是可以用前面的面值表示出来的,跳过,否则从a[i]a[i]a[i]循环到maxnmaxnmaxna[i]a[i]a[i]中的最大值),判断f[j−a[i]]f[j-a[i]]f[ja[i]]能否被表示,可以的话就让f[j]=1f[j]=1f[j]=1即可

#include<bits/stdc++.h>
using namespace std;
int n,a[105],f[25005],ans,maxn;
int main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值