【蓝桥杯冲冲冲】[CEOI2015 Day2] 世界冰球锦标赛

蓝桥杯备赛 | 洛谷做题打卡day32

文章目录

  • [蓝桥杯备赛 | 洛谷做题打卡day32](#蓝桥杯备赛 | 洛谷做题打卡day32)

  • [CEOI2015 Day2] 世界冰球锦标赛

    题目描述

    译自 CEOI2015 Day2 T1「Ice Hockey World Championship

    今年的世界冰球锦标赛在捷克举行。Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有时间观念。他只是单纯的想去看几场比赛。如果他有足够的钱,他会去看所有的比赛。不幸的是,他的财产十分有限,他决定把所有财产都用来买门票。

    给出 Bobek 的预算和每场比赛的票价,试求:如果总票价不超过预算,他有多少种观赛方案。如果存在以其中一种方案观看某场比赛而另一种方案不观看,则认为这两种方案不同。

    输入格式

    第一行,两个正整数 N N N 和 M ( 1 ≤ N ≤ 40 , 1 ≤ M ≤ 1 0 18 ) M(1 \leq N \leq 40,1 \leq M \leq 10^{18}) M(1≤N≤40,1≤M≤1018),表示比赛的个数和 Bobek 那家徒四壁的财产。

    第二行, N N N 个以空格分隔的正整数,均不超过 1 0 16 10^{16} 1016,代表每场比赛门票的价格。

    输出格式

    输出一行,表示方案的个数。由于 N N N 十分大,注意:答案 ≤ 2 40 \le 2^{40} ≤240。

    样例 #1

    样例输入 #1

    5 1000
    100 1500 500 500 1000
    

    样例输出 #1

    8
    

提示

样例解释

八种方案分别是:

  • 一场都不看,溜了溜了
  • 价格 100 100 100 的比赛
  • 第一场价格 500 500 500 的比赛
  • 第二场价格 500 500 500 的比赛
  • 价格 100 100 100 的比赛和第一场价格 500 500 500 的比赛
  • 价格 100 100 100 的比赛和第二场价格 500 500 500 的比赛
  • 两场价格 500 500 500 的比赛
  • 价格 1000 1000 1000 的比赛

有十组数据,每通过一组数据你可以获得 10 分。各组数据的数据范围如下表所示:

数据组号 1 − 2 1-2 1−2 3 − 4 3-4 3−4 5 − 7 5-7 5−7 8 − 10 8-10 8−10
N ≤ N \leq N≤ 10 10 10 20 20 20 40 40 40 40 40 40
M ≤ M \leq M≤ 1 0 6 10^6 106 1 0 18 10^{18} 1018 1 0 6 10^6 106 1 0 18 10^{18} 1018

题解代码

学会利用新知,自己多试试并尝试积攒一些固定解答方案,debug,以下是题解代码 ~

c++ 复制代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cctype>
#define ll long long
#define R register
#define N 55
using namespace std;
template<typename T>inline void read(T &a){
    char c=getchar();T x=0,f=1;
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    a=f*x;
}
ll n,m,w[N],mid,suma[1<<21],sumb[1<<21],cnta,cntb,ans;
inline void dfs(R int l,R int r,R ll sum,R ll a[],R ll &cnt){
    if(sum>m)return;
    if(l>r){
        a[++cnt]=sum;
        return;
    }
    dfs(l+1,r,sum+w[l],a,cnt);
    dfs(l+1,r,sum,a,cnt);
}
int main(){
    read(n);read(m);
    for(R int i=1;i<=n;i++)read(w[i]);
    mid=n>>1;
    dfs(1,mid,0,suma,cnta);
    dfs(mid+1,n,0,sumb,cntb);
    sort(suma+1,suma+1+cnta);
    for(R int i=1;i<=cntb;i++)
        ans+=upper_bound(suma+1,suma+1+cnta,m-sumb[i])-suma-1;
    printf("%lld\n",ans);
    return 0;
}

我的一些话

  • 不知不觉蓝桥杯备战一个月就过去啦,不知道你学到了多少知识呢?正逢除夕,祝大家龙年大吉,万事胜意呀!新的一岁也要越来越坚定勇敢,欣祈年年,岁岁欢洽!

  • 今天学习动态规划,dp属于比较难的部分,这题利用记忆化搜索即可快速解决,需要多动脑,多思考思路还是很好掌握的,虽然一次性AC有一定难度,需要通盘的考虑和理解,以及扎实的数据结构基础才能独立写出AC代码。但无论难易,大家都要持续做题,保持题感喔!一起坚持(o´ω`o)

  • 如果有非计算机专业的uu自学的话,关于数据结构的网课推荐看b站上青岛大学王卓老师的课,讲的很细致,有不懂都可以私信我喔

  • 总结来说思路很重要,多想想,多在草稿纸上画画,用测试数据多调试,debug后成功编译并运行出正确结果真的会感到很幸福!

  • 关于之前蓝桥杯备赛的路线和基本方法、要掌握的知识,之前的博文我都有写,欢迎大家关注我,翻阅自取哦~

  • 不管什么都要坚持吧,三天打鱼两天晒网无法形成肌肉记忆和做题思维,该思考的时候一定不要懈怠,今天就说这么多啦,欢迎评论留言,一起成长:)

相关推荐
不过四级不改名6773 小时前
蓝桥杯速成教程{三}(adc,i2c,uart)
职场和发展·蓝桥杯
虽千万人 吾往矣10 小时前
golang LeetCode 热题 100(技巧)-更新中
算法·leetcode·职场和发展
chenziang110 小时前
leetcode hot 100搜索回溯
算法·leetcode·职场和发展
TANGLONG22210 小时前
【初阶数据结构与算法】八大排序算法之归并排序与非比较排序(计数排序)
java·数据结构·c++·算法·面试·蓝桥杯·排序算法
m0_6949380110 小时前
Leetcode打卡:查询数组中元素出现的位置
算法·leetcode·职场和发展
RS_数模加油站11 小时前
第十六届“蓝桥杯”全国软件和信息技术专业人才大赛简介及资料大全
职场和发展·蓝桥杯
怪憨11 小时前
蓝桥杯——神奇的数组
蓝桥杯
Pandaconda12 小时前
【Golang 面试题】每日 3 题(六)
开发语言·笔记·后端·面试·职场和发展·golang·go
YRr YRr14 小时前
全国硕士研究生入学考试(考研)常识详解之复试考试科目:笔试、面试与加试
考研·面试·职场和发展
chenziang116 小时前
leetcode hot 全部子集
算法·leetcode·职场和发展