[BZOJ2036]聪明的阿卑多
[BZOJ2036]聪明的阿卑多
试题描述
也许你从没听说过阿卑多,但你一定知道他爷爷的爷爷的爷爷,那就是聪明绝顶的阿凡提先生。是的,阿卑多也是个聪明的小孩。 一天,阿卑多骑着他的小毛驴,在小镇上晃悠,正好遇上了小巴依——那个自以为是的小财主。小巴依正在炫耀他的金币: “你们见过这样的金币么?这可不是一般的金币,你看它们多大多重啊!最主要的是,它们每个上面都刻有我的名字和一个编号,是独一无二的!看看,从我出生开始,每 \(2\) 个月,爸爸便给我 \(1\) 个特做的大金币,并从 \(1\) 开始编号,现在我已经有 \(60\) 枚了,哈哈……” 小巴依见了阿卑多,于是便想考一考他:“阿卑多,听说你是最聪明的。看见我每个金币上的数字了吗?你现在拿取一半的金币,并能用你拿的若干金币上的数的和表示我的任意一枚金币上的数。如果你能办到,那么就奖你一枚金币;如果不能,就给我做三年长工好了。” 阿卑多想了一想,说:“我可以只拿 \(\frac{1}{10}\) 就办到,不过如果我办到了,你就得分一半金币给我。” \(\frac{1}{10}\)?小巴依心想,你准备给我当长工好了。 于是阿卑多开始取金币…… 自然,阿卑多出色的完成了任务,得到了 \(30\) 枚金币,同样的,他把这些金币都分给了穷人们。 给你的任务就不同了。
输入
一个数 \(n(1 \le n \le 1000\) 表示金币枚数(金币上的数分别为 \(1\) 到 \(n\))
输出
两个数,阿卑多最少要拿的金币数以及不同的方案数。
输入示例
6
输出示例
3 2
数据规模及约定
见“输入”
题解
首先第一问显然可以贪心做(受二进制的启发)。
第二问其实也是基于这个思想,我们从小到大依次选数,如果已经选的数之和加 \(1\) 大于等于当前要选的数,就可以选这个数。第一问我们已经解决了,步数肯定不会超过 \(logn\),所以可以将它设进 dp 状态里:\(f(i, s, m)\) 表示已选 \(i\) 个数,当前总和是 \(s\),选出的所有数都严格小于 \(m\) 的方案数,然后就可以 dp 啦(注意 \(s\) 在超过 \(n\) 的时候和 \(n\) 取 \(min\) 就好了)。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
#define rep(i, s, t) for(int i = (s); i <= (t); i++)
#define dwn(i, s, t) for(int i = (s); i >= (t); i--)
int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
}
#define maxn 1010
#define maxlog 11
int n, step, f[maxlog][maxn][maxn];
int main() {
n = read();
int sum = 0;
rep(i, 1, n) if(sum < i) sum += i, step++;
printf("%d ", step);
f[0][0][1] = 1;
rep(i, 0, step) rep(s, 0, n) rep(mx, 1, n) if(f[i][s][mx]) {
if(mx <= s + 1 && i < step) f[i+1][min(s+mx,n)][mx+1] += f[i][s][mx];
f[i][s][mx+1] += f[i][s][mx];
}
printf("%d\n", f[step][n][n+1]);
return 0;
}
[BZOJ2036]聪明的阿卑多的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ2429[HAOI2006]聪明的猴子[最小生成树 kruskal]
2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 896 Solved: 575[Submit][Statu ...
- vijos1740 聪明的质监员 (二分、区间求和)
http://www.rqnoj.cn/problem/657 https://www.vijos.org/p/1740 P1740聪明的质检员 请登录后递交 标签:NOIP提高组2011[显示标签] ...
- nyoj 171 聪明的kk
聪明的kk 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 聪明的“KK”非洲某国展馆的设计灵感源于富有传奇色彩的沙漠中陡然起伏的沙丘,体现出本国不断变换和绚丽多彩的 ...
- NOIP2011提高组 聪明的质监员 -SilverN
题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...
- 最小生成树 2429: [HAOI2006]聪明的猴子
BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 877 Solved: 566[Submit][ ...
- [原]携程预选赛A题-聪明的猴子-GCD+DP
题目: 聪明的猴子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 【解题报告】[动态规划] CodingTrip - 携程编程大赛 (预赛第一场)- 聪明的猴子
原题: 聪明的猴子 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Problem D ...
- 做一个聪明的.net程序员
最近看了传智播客(http://net.itcast.cn/)的.net培训视频,感受颇深,忍不住要把感受写下来跟网友分享一下. 我从接触.net到现在已经至少过去了三五个年头,用.net也已经做了若 ...
随机推荐
- python_70_内置函数2
#hex() 转16进制 oct()转8进制 print(hex(255)) print(oct(10)) #id() 返回内存地址 print(id('a')) ''' isinstance(obj ...
- 8--oop
oop-Python面向对象 Python的面向对象 面向对象编程 基础 共有私有 继承 组合,Mixin 魔法函数 魔法函数概述 构造类魔法函数 运算类魔法函数 1.面向对象概述(ObjectOri ...
- pandas 代码
def get_train_data(): df = pd.read_csv('data/train.csv', encoding='utf_8') # df1 = pd.read_csv('data ...
- checkbox 最多选两项
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Oracle数据库学习(一)
Oracle数据库由甲骨文公司开发,是基于对象的关系型数据库:下面是简单的学习数据库操作等知识. 1.SQL单表查询(设一个表名为tab) (1)查询所有记录 select * from tab(一般 ...
- OI,我的决心
虽然从初一就开始NOIP,但沉溺于游戏编程等各种乱七八糟的技术,一直没对算法有过透彻的研究. ——————————简单的来说就是水过了—————————— 我生于一个弱省,就读于一所弱校(我们全区的都 ...
- django项目实现第三方github登录
OAuth(开放授权 Open Authorization)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容 ...
- 二十八、MySQL 元数据
MySQL 元数据 你可能想知道MySQL以下三种信息: 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数. 数据库和数据表的信息: 包含了数据库及数据表的结构信息. M ...
- web前后台数据交互的几种方式
1.利用cookie对象 Cookie是服务器保存在客户端中的一小段数据信息.使用Cookie有一个前提,就是客户端浏览器允许使用Cookie并对此做出相应的设置.一般不赞成使用Cookie. (1) ...
- linux 命令学习(持续完善中...)
linux 命令学习(持续完善中...) 主要是记录一些开发过程中用到的linux命令,慢慢补充 一.用户 1.添加用户: useradd 用户名 2.设置密码:passwd 用户名 ,然后按照提示输 ...