CQYZ-OJ P1377 危险的组合

问题描述

  有一些装有铀元素(用U表示)和铅元素(用L表示)的盒子,数量足够多,要求将N个盒子排成一行,但至少有M个U放在一起,有多少种方法?

输入格式

  两个整数 N 和 M 。

输出格式

  一个整数,表示方法数 。

思路:

  因为该题满足局部最优导致整体最优,故动规

  令 f i 为 有i个盒子能满足的方法数

  

  则对于每一个新的箱子i

    当除它以外的箱子(及之前的i-1个箱子)满足条件

      那么显然无论新箱子放不放U都满足条件

      提供 f(i-1)*2种方案

    当除它以外的箱子无法满足条件时

      则第i个箱子到第i-m-1个箱子都不得不放U

      则提供 2i-m-1 - f[i-m-1]

       (注释:因为前i-1个箱子不满足条件,那么第i-m个箱子一定是放L的,那么这之前共有2i-m-1 种放法,注意,因为这里是包含了第i-m-1个箱子前可以满足条件的情况的,那么应当减去f[i-m-1] 以求得之前i-1个箱子不满足条件的情况)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
ll f[65];
ll qpow[65];

void re0()   //求解2的幂
{
    qpow[0]=1;
    for(int i=1;i<=n-m;i++)
     qpow[i]=qpow[i-1]*2;

    return ;
}

void solve()
{
    ll sum=1;
    memset(f,0,sizeof(f));
    f[m]=1;
    for(int i=m+1;i<=n;i++)
    {
        f[i]=f[i-1]*2+qpow[i-m-1]-f[i-m-1];
    }
    cout<<f[n]<<endl;

        return ;
}
int main(){

    scanf("%d%d",&n,&m);
    re0();

    solve();

    return 0;
}

    

原文地址:https://www.cnblogs.com/Aloyd/p/8297954.html

时间: 2024-07-31 13:59:20

CQYZ-OJ P1377 危险的组合的相关文章

2825 codevs危险的组合(递推)

2825 危险的组合 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够多.要求把N个盒子放成一行,但至少有3个U放在一起,有多少种方法? 输入描述 Input Description 包含一个整数N 输出描述 Output Description 输出一个整数表示方法数. 样例输入 Sample Input 样例1:4 样例2:5 样例输出 Sample Output

uva 580 危险的组合(排列组合)

Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description During the early stages of the Manhattan Project, the dangers of the new radioctive materials were not widely known. Vast new factory cities were buil

危险的组合

[题目描述] 有一些装有铀(用U表示)和铅(用L表示)的盒子,数量均足够多.要求把N个盒子放成一行,但至少有3个U放在一起,询问有多少种方法. [输入描述] 包含一个整数N. [输出描述] 输出一个整数表示方法数. [样例输入] 样例1: 4 样例2: 5 [样例输出] 样例1: 3 样例2: 8 [数据范围及提示] 对于100%的数据,3<=N<=30. 样例1解释: UUUL.LUUU.UUUU. 样例2解释: UUUUL.UUUUU.UUULU.UUULL.LUUUU.LUUUL.ULU

cqyz oj | 【训练题】HB办证 P1419 | DP动态规划

Description HB要办个签证,办证处是一座 M 层的大楼,每层楼都有 N 个办公室,编号为1..N,每个办公室有一个签证员,签证需要让第 M 层的某个签证员盖章才有效.每个签证员都要满足下面三个条件之一才会给HB盖章: 这个签证员在1楼. HB的签证已经给这个签证员的正楼下(房间号相同)的签证员盖过章了. HB的签证已经给这个签证员的相邻房间(房间号相差1,楼层相同)的签证员盖过章了. 每个签证员盖章都要收取一定费用,这个费用不超过1000000000.找出费用最小的盖章路线,使签证生

cqyz oj | 树的分治 | 树形DP | 树的重心

Description 给定一棵N个节点的带权树,定义dist(u,v)为u,v两点间的最短路径长度,路径的长度义为路径上所有边的权和.再给定一个K,如果对于不同的两个结点a,b,如果满足dist(a,b)<=K,则称(a,b)为合法点对. 你的任务是求合法点对个数. Input 第一行包含两个个整数N和K,接下来的N-1行,每行包含三个整数:u,v,len,表示树边(u,v)的长度len. Output 一个整数,表示合法点对的数目. Sample Input 1 5 4 1 2 3 1 3

cqyz oj | 潜水比赛 | 贪心

Description 在马其顿王国的ohide湖里举行了一场潜水比赛.其中一个项目是从高山上跳下水,再潜水到达终点.这是一个团体项目,一支队伍由n个人组成.在潜水时必须使用氧气瓶,但是每支队伍只有一个氧气瓶.最多两个人同时使用一个氧气瓶,但此时两人必须同步游泳,因此到达终点的时间等于较慢的一个单独游到终点所需要的时间.好在大家都很友好,因此任何两个人都愿意一起游泳.安排一种潜水策略,使得最后一名选手尽早到达终点. Input 第1行:一个整数n,表示队伍的人数. 以下n行,每行一个整数,表示第

cqyz oj | 树的相交路径 | 最近公共祖先

Description 给定含 n 个结点.边带权的无根树,请回答下面的询问: 1 a b c d:询问路径a->b是否是路径c->d的子路径. 2 a b c d:询问路径a->b和c->d的最长公共路径长度. Input 第一行包括两个正整数 n,m,表示树的节点数和询问数,树结点从1到n编号. 接下来n-1行描述树边情况,其中第i行包含三个整数 a, b和t,表示第i条双向连接a和b,长度为t. 接下来m行描述询问情况,每一个询问如题目描述格式. Output 每个询问的回答

cqyz oj | 树上的询问 | 最近公共祖先

Description 现有一棵 n 个节点的棵, 树上每条边的长度均为 1. 给出 m 个询问, 每次询问两个节点 x,y, 求树上到 x,y 两个点距离相同的节点数量. Input 第一个整数 n, 表示树有 n 个点. 接下来 n-1 行每行两整数 a, b, 表示从 a 到 b 有一条边. 接下来一行一个整数 m, 表示有 m 个询问. 接下来 m 行每行两整数 x, y, 询问到 x 和 y 距离相同的点的数量. Output 共 m 行, 每行一个整数表示询问的答案. Sample

cqyz oj | 罕见的秩序 | 拓扑排序

Description 一个珍稀书籍的收藏家最近发现了一本用陌生的语言写的一本书,这种语言采用和英语一样的字母.这本书有简单的索引,但在索引中的条目的次序不同于根据英语字母表给出的字典排序的次序.这位收藏家试图通过索引来确定这个古怪的字母表的字符的次序,(即对索引条目组成的序列进行整理),但因为任务冗长而乏味,就放弃了. 请编写程序完成这位收藏家的任务,程序输入一个按特定的序列排序的字符串集合,确定字符的序列是什么. Input 输入是由大写字母组成的字符串的有序列表,每行一个字符串.每个字符串