编程之美2015初赛第二场AB

2023-11-19

题目1 : 扑克牌

时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
一副不含王的扑克牌由52张牌组成,由红桃、黑桃、梅花、方块4组牌组成,每组13张不同的面值。现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数。

牌的表示方法为XY,其中X为面值,为2、3、4、5、6、7、8、9、T、J、Q、K、A中的一个。Y为花色,为S、H、D、C中的一个。如2S、2H、TD等。

输入
第一行为一个整数T,为数据组数。

之后每组数据占一行。这一行首先包含一个整数N,表示给定的牌的张数,接下来N个由空格分隔的字符串,每个字符串长度为2,表示一张牌。每组数据中的扑克牌各不相同。

输出
对于每组数据输出一行,形如”Case #X: Y”。X为数据组数,从1开始。Y为可能的方案数,由于答案可能很大,请输出模264之后的值。

数据范围
1 ≤ T ≤ 20000

小数据

1 ≤ N ≤ 5

大数据

1 ≤ N ≤ 52

样例输入
5
1 TC
2 TC TS
5 2C AD AC JC JH
4 AC KC QC JC
6 AC AD AS JC JD KD
样例输出
Case #1: 1
Case #2: 0
Case #3: 48
Case #4: 24
Case #5: 120

dp。

(以为是排列组合,想了很久无果)
其实和【BZOJ 1079】完全一样。

如果dp的状态是每个面值剩余几张的话复杂度是 O(413) ,但如果变成剩余几张的有几种面值的话就是 O(134) 了,因为剩余数量相同的面值是等价的。

f[a][b][c][d][last] 表示剩余 1 张的有a种面值,剩余 2 张的有b种面值…上一次选的是剩余 last 张的一种面值。

转移就是在选择剩余 last1 张的面值中选择方案少一种,其他任意,详见代码。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <map>
#include <vector>
#include <iostream>
#include <set>
#define ull unsigned long long
using namespace std;
ull f[14][14][14][14][5];
char s[10];
int T,n,c[14],sum[10];
ull dfs(int a,int b,int c,int d,int last)
{
    if (f[a][b][c][d][last]) return f[a][b][c][d][last];
    ull tmp=0;
    if (a) tmp+=dfs(a-1,b,c,d,1)*(a-(last==2));
    if (b) tmp+=dfs(a+1,b-1,c,d,2)*(b-(last==3));
    if (c) tmp+=dfs(a,b+1,c-1,d,3)*(c-(last==4));
    if (d) tmp+=dfs(a,b,c+1,d-1,4)*d;
    f[a][b][c][d][last]=tmp;
    return tmp;
}
int main()
{
    cin>>T;
    for (int t=1;t<=T;t++)
    {
        printf("Case #%d: ",t);
        scanf("%d",&n);
        for (int i=1;i<=13;i++)
            c[i]=0;
        for (int i=1;i<=n;i++)
        {
            scanf("%s",s);
            if (s[0]-'0'>=2&&s[0]-'0'<=9)
                c[s[0]-'0']++;
            if (s[0]=='A') c[1]++; 
            if (s[0]=='T') c[10]++;
            if (s[0]=='J') c[11]++;
            if (s[0]=='Q') c[12]++;
            if (s[0]=='K') c[13]++;
        }
        for (int i=1;i<=10;i++)
            sum[i]=0;
        for (int i=1;i<=13;i++)
            sum[c[i]]++;
        for (int i=1;i<=4;i++)
            f[0][0][0][0][i]=1;
        ull ans=dfs(sum[1],sum[2],sum[3],sum[4],0);
        for (int i=1;i<=13;i++)
            if (c[i]>1)
            {
                for (int j=2;j<=c[i];j++)
                    ans*=j;
            }
        printf("%llu\n",ans);
    }
    return 0;
}

题目2 : 攻城略地

时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
A、B两国间发生战争了,B国要在最短时间内对A国发动攻击。已知A国共有n个城市(城市编号1, 2, …, n),城市间有一些道路相连。每座城市的防御力为w,直接攻下该城的代价是w。若该城市的相邻城市(有道路连接)中有一个已被占领,则攻下该城市的代价为0。

除了占领城市,B国还要摧毁A国的交通系统,因而他们需要破坏至少k条道路。由于道路损毁,攻下所有城市的代价相应会增加。假设B国可以任意选择要摧毁的道路,那么攻下所有城市的最小代价是多少?

输入
第一行一个整数T,表示数据组数,以下是T组数据。

每组数据第一行包含3个整数n, m, k。

第二行是n个整数,分别表示占领城市1, 2, …, n的代价w。

接下来m行每行两个数i, j,表示城市i与城市j间有一条道路。

输出
对于每组数据输出一行,格式为”Case #X: Y”。X表示数据编号(从1开始),Y为答案。

数据范围
1 ≤ T ≤ 30

k ≤ m

0 ≤ w ≤ 108

小数据

1 ≤ n ≤ 1000

0 ≤ m ≤ 5000

大数据

1 ≤ n ≤ 106

0 ≤ m ≤ 106

样例输入
2
4 4 2
6 5 3 4
1 2
1 3
2 3
2 4
4 4 4
6 5 3 4
1 2
1 3
2 3
2 4
样例输出
Case #1: 7
Case #2: 18

贪心。

在每一个连通块都选择权值最小的来占领,一定最优。

也就是说权值较大的最好不要从连通块中分离出去。

法一:
首先把 ans 设为权值总和,按照权值降序排列,让大的使用一条边加入连通块中, ans 减去大的权值,直到把 mk 条边全部用完。
(注意连通块内的最小的点得权值不能去掉)

法二:
可以把每个连通块中除了树上的边都删去,看是否删够了 k 条边,如果不够的话就把连通块中除最小权值点外的点排序,去掉并让答案加上这个权值(因为他独立出来了);
直到删够了k条边。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程之美2015初赛第二场AB 的相关文章

  • 【二分+贪心】用 N 根绳子裁剪出 M 根等长绳子

    有 N 根绳子 第 i 根绳子的长度为 l i 现在需要 M 根等长的绳子 你可以对这 N 根绳子进行任意裁剪 不能拼接 请你计算出这 M 根绳子最长的长度 输入描述 第一行包括两个整数 N M 含义如题所述 1 lt N M lt 100
  • 【DP练习】美元DOLLARS

    1040 练习题目 美元DOLLARS Description 在以后的若干天里戴维将学习美元与德国马克的汇率 编写程序帮助戴维何时应买或卖马克或美元 使他从100美元开始 最后能获得最高可能的价值 Input 输入文件的第一行是一个自然数
  • 动态规划问题——最长上升子序列(LIS)(二)

    原文转载自我的博客benym cn 推荐链接 动态规划问题 最长上升子序列 LIS 一 动态规划问题 最长上升子序列 LIS 三 题目描述 一天 小凯同学震惊的发现 自己无内的PM2 5指标是有规律的 小凯采样了PM2 5数值 发现PM2
  • Bracket Coloring

    Bracket Coloring 题意 给出一个括号序列 定义漂亮序列为匹配括号序列或者反转之后是匹配括号序列的序列 现在要求染色 使得相同颜色的括号组成漂亮序列 问最少需要多少种颜色即每个括号染的颜色 思路 这里可以用栈来匹配括号序列 因
  • 2605. 从两个数字数组里生成最小数字

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 枚举比较法 方法二 集合的位运算表示法 写在最后 Tag 贪心 位运算 数组 题目来源 2605 从两个数字数组里生成最小数字 题目解读 给定两个各自只包含数字 1 到 9 的两个数组
  • Stall Reservations POJ - 3190

    这道题 是学长给我们布置的学习用的题目 重在给我们讲解了什么是优先队列以及其对应的贪心问题 好了 先送上 中文翻译过的题意 手动 滑稽 Oh those picky N 1 lt N lt 50 000 cows They are so p
  • hdu 1069 Monkey and Banana

    Problem acm hdu edu cn showproblem php pid 1069 Reference www cnblogs com kuangbin archive 2011 08 04 2127291 html 题意 给
  • 16.4 线性DP练习——【字符串转换】

    文章目录 题目描述 输入描述 输出描述 输入输出样例 最终代码c c 过程理解 题目描述 小蓝拥有两个字符串S T 他希望通过如下操作使得字符S转换为字符串T 操作有一下三种 删除一个字符 插入一个字符 将一个字符改为另一个字符 问最少需要
  • 高级快速读入

    namespace fastIO define BUF SIZE 100000 fread gt read bool IOerror 0 inline char nc static char buf BUF SIZE p1 buf BUF
  • 牛客网-网易2018笔试第7题 -合唱(DP问题)

    题目描述 小Q和牛博士合唱一首歌曲 这首歌曲由n个音调组成 每个音调由一个正整数表示 对于每个音调要么由小Q演唱要么由牛博士演唱 对于一系列音调演唱的难度等于所有相邻音调变化幅度之和 例如一个音调序列是8 8 13 12 那么它的难度等于
  • GYM 102059 G Fascination Street

    G Fascination Street 参考 给出一串n 2e5 个灯 每个灯点亮可以照到相邻三个位置 每个灯点亮都有不同的花费 现在可以交换k 9 次灯的位置 求把所有n个位置都照到的最小花费 交换的肯定是一个亮的灯和一个灭的灯 不然是
  • BZOJ4868 [Shoi2017]期末考试

    YY一下的话感觉代价关于最晚出分时间是一个单峰函数 三分最晚的出分时间 然后贪心一下算代价就行 如果A gt B就只用B就行了 要不然的话出分时间小于当前限制的都可以随便往后调直到到达限制 那么先尽量用A 调不到限制以内的再用B即可 inc
  • AcWing 1247. 后缀表达式

    老师的讲课网址 https www acwing com video 736 第二个图就已经告诉我们只要有一个减号 我们就可以组成至少含一个减号的所有组合 比如说一个减号三个加号我们可以组合成 1 2 3 4 所以代码如下 include
  • 备战2023蓝桥国赛-传纸条

    题目描述 解析 这道题想了我好久 一开始我是想假如只走一条路线 从 1 1 走到 m n 这种问题该怎么解决呢 针对这种问题我是设了dp k i j 表示走了k步到达 i j 的好心程度之和的最大值 然后根据这个来写出转移方程来计算 后面就
  • 备战2023蓝桥国赛-饼干

    题目描述 解析 这道题我想了很多种解决方法 但无一例外都失败了 实在是按照常规线性DP的思路真的想不出来 看了题解之后才知道它是分为三步解决这个问题的 第一步 缩小最优解的范围 先用贪心将最优解缩小到某个较小的范围内 再DP求出精确的最优解
  • 【codeforces #290(div 1)】ABC题解

    A Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard o
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • Match Points【Codeforces 1156C】【二分答案】

    题目链接 题意有点像上海EC某年的一道铜牌题 具体是哪年记不得了 我们要去N个的关系 使得最多的匹配对达到他们的差值 Z 这样的情况 有这样的一组数据可以很好的反映这道题为什么有人会WA了 4 3 1 4 5 7 但是 同时也证明了 我们取
  • AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

    题目 n n lt 500 种球 第i种有ai 0 lt ai lt 1e12 个球 m m lt 5e5 个盒子 第j个能放bj 0 lt bj lt 1e12 个球 特别地 第j个盒子最多能放i j个第i种球 求m个盒子能放的最多的球的
  • 插入数计数类 / 转为换行类dp:AT_agc024_e

    https www luogu com cn problem AT agc024 e 首先题目可以转化成每次插入一个数 满足字典序递增 如果只考虑暴力dfs 先别上dp 想想怎么合法和不算重 合法 也就是插入数有3种情况 插到末尾 插到比他

随机推荐

  • kafka的安装和使用

    ZooKeeper简介 ZooKeeper 是一个为分布式应用所设计的分布的 开源的 java 协调服务 分布式的应用可以建立在同步配置管理 选举 分布式锁 分组和命名等服务的更高级别的实现的基础之上 ZooKeeper 意欲设计一个易于编
  • C语言(二十一)

    1 查找指定字符 本题要求编写程序 从给定字符串中查找某指定的字符 输入 输入待查找的字符c以及字符串s 输出 找到则输出字符c在字符串s中所对应的最大下标index 否则输出 Not Found 优化目标 无 include
  • TCP/IP详解 卷1:协议 学习笔记 第二十九章 网络文件系统

    NFS 网络文件系统 使客户可以透明地访问服务器上的文件和文件系统 NFS的基础是RPC 两个常用的网络编程API socket和TLI 运输层接口 Transport Layer Interface 通信的双方可使用不同的API RPC可
  • 蚁剑的使用以及用蚁剑做一道ctf题

    一 蚁剑的介绍及下载 1 蚁剑是一款和菜刀相像的shell控制端软件 主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员 2 蚁剑的下载 这是gethub的官方下载地址 供大家下载 3 蚁剑的安装 点击初始化就完成安装 再次点
  • Linux进程管理:deadline调度器

    一 概述 实时系统是这样的一种计算系统 当事件发生后 它必须在确定的时间范围内做出响应 在实时系统中 产生正确的结果不仅依赖于系统正确的逻辑动作 而且依赖于逻辑动作的时序 换句话说 当系统收到某个请求 会做出相应的动作以响应该请求 想要保证
  • Jib使用小结(Maven插件版)

    小结三 多次构建后 积累的无用镜像 如下所示 构建多次后 本地会遗留多个名为 tag也是的镜像 root maven hellojib docker images REPOSITORY TAG IMAGE ID CREATED SIZE b
  • 懒人式迁移服务器深度学习环境(完全不需要重新下载)

    换服务器了 想迁移原来服务器上的深度学习环境 但又觉得麻烦懒得重新安装一遍anaconda pytorch 有没有办法能不费吹灰之力直接迁移 接下来跟着我一起 懒汉式迁移 本方法适用于在同一内网下的两台服务器之间互相迁移 不在同一局域网下的
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • C++ primer智能指针(HasPtr)实现

    智能指针显然是C 吸引人的地方之一 必须掌握 看了 C primer 里面着重讲了智能指针的实现方式 书中说到 HasPtr 注 就是自定义的智能指针 在其它方面的行为与普通指针一致 具体而言 复制对象时 副本和原对象将指向同一基础对象 如
  • linux下libxml库的安装及编译

    linux下libxml库的安装及编译 1 下载和安装LIBXML2 Libxml2是个C语言的XML程式库 能简单方便的提供对XML文件的各种操作 并且支持XPATH查询 及部分的支持XSLT转换等功能 Libxml2的下载地址是 htt
  • Mysql8.0出现this is incompatible with sql_mode=only_full_group_by

    MySQL的sql mode模式说明及设置 sql mode是个很容易被忽视的变量 默认值是空值 在这种设置下是可以允许一些非法操作的 比如允许一些非法数据的插入 在生产环境必须将这个值设置为严格模式 所以开发 测试环境的数据库也必须要设置
  • phabricator mysql_搭建 Phabricator 我遇到的那些坑 - 简书

    一 可能会用到的命令 1 重启phd守护线程 先进入到Fabricator文件夹下面 然后 bin phd log 2 删除一个代码仓库 bin remove destroy rMOBILE 代码库的前缀名字 3 重启mysql数据库 su
  • 数据结构:力扣OJ题

    目录 编辑题一 链表分割 思路一 题二 相交链表 思路一 题三 环形链表 思路一 题四 链表的回文结构 思路一 链表反转 查找中间节点 本人实力有限可能对一些地方解释的不够清晰 可以自己尝试读代码 望海涵 题一 链表分割 现有一链表的头指针
  • Java8 新特性 之 lambda 表达 和 函数式接口

    lambda 表达式 概念 lambda 表达式是一个匿名函数 可以把 lambda 表达式理解为是一段可以传递的代码 更简洁 更灵活 使 Java 的语言表达能力得到了提升 lambda 表达式是作为接口的实现类的对象 万事万物皆对象 使
  • Java取模运算中余数的符号选择问题

    Java取模运算中 余数 的符号和 被除数 符号相同 除号前面的数 即与第一个数的符号相同 public class MyTestProgram public static void main String args 被除数 除数 商 被除
  • idea连接mysql注册登录_idea配置连接数据库的超详细步骤

    学习时 使用IDEA的时候 需要连接Database 连接时遇到了一些小问题 下面记录一下操作流程以及遇到的问题的解决方法 一 连接操作 简介 介绍如何创建连接 具体连接某个数据库的操作流程 1 1 创建连接 打开idea 点击右侧的 Da
  • 并行程序设计作业7/7

    目录 两个线程 一个生产者一个消费者 2k个线程 奇数消费者偶数生产者 2k个线程 每个既可以是生产者又可以是消费者 两个线程 一个生产者一个消费者 include
  • cmake policy

    1 cmake policy是什么 cmake policy可以理解为cmake的语法标准 也就是说 它规定了cmake在解析CMakeLists txt文件时的行为 2 cmake policy的用途是什么 cmake在进化的过程中 需要
  • CAN分析仪 USBCAN USB转CAN CAN转换调试器接口卡使用指导

    USBCAN系列便携式CAN分析仪 通过USB接口快速扩展一路CAN通道 使接入CAN网络非常容易 它具有一体式和小巧紧凑的外形 特别适合于随身携带 第一步 将usbcan卡连接电脑如图 usb灯亮红灯 打开 USBCAN系列便携式CAN总
  • 编程之美2015初赛第二场AB

    题目1 扑克牌 时间限制 2000ms 单点时限 1000ms 内存限制 256MB 描述 一副不含王的扑克牌由52张牌组成 由红桃 黑桃 梅花 方块4组牌组成 每组13张不同的面值 现在给定52张牌中的若干张 请计算将它们排成一列 相邻的