BZOJ 1111: [POI2007]四进制的天平Wag
1111: [POI2007]四进制的天平Wag
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 223 Solved: 151
[Submit][Status][Discuss]
Description
Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会。并且她准备给每位来宾准备一些金子作为礼物。为了不伤及每个人的脸面,每个人获得的金子必须相同。Mary将要用一个天平来称量出金子。她有很多的砝码,所有砝码的质量都是4的幂。Mary将金子置于左边并且将砝码置于右盘或者两个盘。她希望每次称量都使用最少的砝码。并且,他希望,每次都用不同的称量方法称出相同质量的金子。对于给定的质量n,Mary希望知道最少需要用多少个砝码可以完成称量,并且想知道用这么多个砝码一共有多少种方式进行称量。
Input
输入文件仅包含一个整数,表示Mary希望给每个人的金子的质量。(1<=n<=10^1000)
Output
输出文件仅包含一个整数,表示一共可能的称量方式对10^9的模。
Sample Input
Sample Output
样例解释
一共有三种方式称量出166。166=64+64+16+16+4+1+1。166=256-64-16-16+4+1+1。166=256-64-16-4-4-1-1。
HINT
Source
分析
讲真,这题动态规划的思路不难,上了趟WC就有了,但是废了好大劲才把这个巨型整数变成4进制,当然中间是“天马行空”就是了。
假如已经有了这个整数的四进制表示方法,如166的四进制数2212,称第1个2为第1位,第2个2为第2位,而1为第3位。
动态规划如下:
F[i][0]表示第i位上目前就是第i位数字的最小操作数。
F[i][1]表示第i位上目前是第i位数字+1的最小操作数。
G[i][0]和G[i][1]分别对应两者的方案数。
对于F数组,有如下转移——
F[i][0] <- F[i - 1][0] + num[i]
F[i][0] <- F[i - 1][1] + 4 - num[i]
F[i][1] <- F[i - 1][0] + num[i] - 1
F[i][1] <- F[i - 1][1] + 3 - num[i]
显然就是枚举达到当前转态要求的数字,可以用什么方式得到。要么是从0加到num[i],要么是从4减到num[i]。
代码
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> using namespace std; #define lim 100000 int stk[lim]; class BigNum
{
private:
int s[lim]; char gc(void)
{
return getchar();
} void pc(char c = '\n')
{
putchar(c);
} int gl(void)
{
int len = lim; while (!s[--len] && len); len = len == ? : len; return len;
} public:
BigNum(void)
{
memset(s, , sizeof(s));
} void read(void)
{
int tot = , len = ; for (char c = gc(); c >= ''; c = gc())
stk[++tot] = c - ''; while (tot)s[++len] = stk[tot--];
} void print(void)
{
for (int len = gl(); len; )
pc(s[len--] + '');
} void println(void)
{
print(); pc();
} int mod4(void)
{
int res = ; for (int len = gl(); len; )
res = (res* + s[len--]) & ; return res;
} void div4(void)
{
for (int len = gl(); len; --len)
s[len - ] += (s[len] & )*, s[len] >>= ; s[] = ;
} bool not0(void)
{
if (gl() > || s[])
return true;
return false;
}
}num; const int MOD = 1e9; int f[lim][];
int g[lim][]; void Min(int &a, int b)
{
a = min(a, b);
} void add(int &a, int b)
{
a += b; if (a >= MOD)
a -= MOD;
} signed main(void)
{
num.read(); int tot = ; while (num.not0())
stk[++tot] = num.mod4(), num.div4(); reverse(stk + , stk + + tot); memset(g, , sizeof(g));
memset(f, 0x3f3f3f3f, sizeof(f)); f[][] = ; g[][] = ;
f[][] = ; g[][] = ; for (int i = ; i <= tot; ++i)
{
Min(f[i][], f[i - ][] + stk[i]);
Min(f[i][], f[i - ][] + - stk[i]);
Min(f[i][], f[i - ][] + stk[i] + );
Min(f[i][], f[i - ][] + - stk[i]);
} for (int i = ; i <= tot; ++i)
{
if (f[i][] == f[i - ][] + stk[i])
add(g[i][], g[i - ][]);
if (f[i][] == f[i - ][] + - stk[i])
add(g[i][], g[i - ][]);
if (f[i][] == f[i - ][] + stk[i] + )
add(g[i][], g[i - ][]);
if (f[i][] == f[i - ][] + - stk[i])
add(g[i][], g[i - ][]);
} printf("%d\n", g[tot][]);
}
BZOJ_1111.cpp
@Author: YouSiki
BZOJ 1111: [POI2007]四进制的天平Wag的更多相关文章
- bzoj 1111 [POI2007]四进制的天平Wag 数位Dp
1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 302 Solved: 201[Submit][St ...
- 1111: [POI2007]四进制的天平Wag
1111: [POI2007]四进制的天平Wag 链接 题意: 用一些四进制数,相减得到给定的数,四进制数的数量应该尽量少,满足最少的条件下,求方案数. 分析: 这道题拖了好久啊. 参考Claris的 ...
- BZOJ1111 : [POI2007]四进制的天平Wag
POI2007完结撒花~ 首先将n转化为四进制,从低位到高位DP f[i]表示这一位不向下一位借位 g[i]表示这一位向下一位借位,但借的那个不算在i f[0]=0,g[0]=inf f[i]=mer ...
- [POI2007]四进制的天平Wag
Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称 ...
- bzoj 1111 - 四进制的天平
Description 给定 1000的十进制数, 求 最小的 四幂拆分 方案 有多少种 Solution 先大除法 \(n\log_4(n)\)次取余转化为 四进制数. 然后从 低位 往 高位 \( ...
- T2963 贪吃蛇【BFS,四进制状压,A*】
Online Judge:未知 Label:BFS,四进制状压,暴力,A*,哈希,玄学. 题目描述 给定一个n*m的地图和蛇的初始位置,地图中有些位置有石头,蛇不能经过.当然蛇也不能爬到地图之外. 每 ...
- .net 获取时间十二进制与二十四进制
[说明] visual studio工具,.net项目,获取时间 [易错问题] ①二十四小时制(HH小时大写) System.DateTime.Now.ToString("yyyy-MM-d ...
- java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制
package com.rgy.Test; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; ...
- Java【第二篇】基本语法之--进制、运算符
进制 对于整数,有四种表示方式: 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头. 十进制:0-9 ,满 10 进 1. 八进制:0-7 ,满 8 进1. 以数字 0 开头表示. 十六进制 ...
随机推荐
- Mysql慢查询操作梳理
Mysql慢查询解释MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询 ...
- Java System.getProperty()方法获取系统信息
用 System.getProperty()方法能获取到的系统信息: java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.u ...
- AAL template: ROI to brain lobe
Reference: Altmann A, Schröter M S, Spoormaker V I, et al. Validation of non-REM sleep stage decodin ...
- css中如何设置字体
来自百度的回答: 建议使用font-family: "Microsoft YaHei";支持UTF-8和GB2312字符集. 不生效的3种情况:1.当此属性定义的是全局样式时,对于 ...
- Jquery操作下拉框(DropDownList)实现取值赋值
Jquery操作下拉框(DropDownList)想必大家都有所接触吧,下面与大家分享下对DropDownList进行取值赋值的实现代码 1. 获取选中项: 获取选中项的Value值: $('sele ...
- 解决Ehcache缓存警告问题
警告: Creating a new instance of CacheManager using the diskStorePath "D:\Apache Tomcat 6.0.18\te ...
- Centos 7 安装jdk 配置环境变量
在Centos7 终端中,我们输入java -version可以看到java的版本,但是输入javac却没有反应 原因是系统中预装的是openjdk jre不是真正的jdk,所以还得自己装好,然后配置 ...
- 开发备忘:AngularJS Syntax error, unrecognized expression in template file
在写基于Angular的项目过程中,运行 grunt test的时候,一直给我蹦出这个错误,导致我的test一直跑不过,怎么试都是失败,经过重复排查,发现是因为template file中的html元 ...
- Android -- Apk安装简诉
安装涉及到如下几个目录 system/app 系统自带的应用程序,无法删除 data/app 用户程序安装的目录,有删除权限. 安装时把apk文件复制到此目录 data/data 存放 ...
- Webwork 学习之路【04】Configuration 详解
Webwork做为经典的Web MVC 框架,个人觉得源码中配置文件这部分代码的实现十分考究. 支持自定义自己的配置文件.自定义配置文件读取类.自定义国际化支持. 可以作为参考,单独引入到其他项目中, ...