bzoj 1111 - 四进制的天平
Description
给定 1000的十进制数, 求 最小的 四幂拆分 方案 有多少种
Solution
先大除法 \(n\log_4(n)\)次取余转化为 四进制数.
然后从 低位 往 高位 \(dp\) .
记 \(f[i]\) 表示不往上借位的最小代价.
\(g[i]\) 表示往上借位的最小代价(被借的位的代价先不计算).
那么最后答案为 \(f[n]+(g[n]+1)\) (可以往更高位再借 \(1\)).
转移为
\(f[i] = min(f[i-1] + a[i], g[i-1] + a[i] + 1)\)
\(g[i] = min(f[i-1] + 4 - a[i], g[i - 1] + 3 - a[i])\)
边界为
先去掉最低位的所有 \(0\) , 然后 \(f=0,g=inf\).
因为要求方案, 所以在 \(f,g\) 维护二元组 \((cost.ways)\) 即可
Code
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cassert>
#define rep(i, a, b) for (int i = (a); i <= (b); ++ i)
#define per(i, a, b) for (int i = (a); i >= (b); -- i)
#define For(i, a, b) for (int i = (a); i < (b); ++ i)
#define foreach(it, c) for (__typeof((c).begin()) it = (c).begin(); it != (c).end(); ++ it)
#define fore(e, x, y) for (int ep = e(x), y = e[ep].y; ep; y = e[ep = e[ep].nxt].y)
using namespace std;
const int N = 1e3 + 7;
const int M = 2e3 + 7;
const int INF = 1e9 + 7;
const int Mod = 1e9;
inline int pls(int x, int y) {return (x + y) % Mod;}
inline int mns(int x, int y) {return pls(x, Mod - y);}
inline int mul(int x, int y) {return 1LL * x * y % Mod;}
inline int Add(int &x, int y) {return x = pls(x, y);}
int n, m;
char s[N];
int b[N], a[M];
struct rec {
int cost, ways;
inline rec operator + (const rec &v) {
if (cost == v.cost) {return (rec){cost, pls(ways, v.ways)};}
else return cost < v.cost ? *this : v;
}
inline rec operator + (const int d) const {
return (rec){cost + d, ways};
}
}f[M], g[M];
int main() {
#ifndef ONLINE_JUDGE
freopen("a.in", "r", stdin);
#endif
scanf("%s", s+1);
n = strlen(s+1);
rep (i, 1, n) b[i] = s[i] - '0';
reverse(b+1, b+n+1);
while (n > 0) {
int res = 0;
per (i, n, 1) {
int d = res * 10 + b[i];
b[i] = d / 4;
res = d % 4;
}
while (n > 0 && b[n] == 0) --n;
a[++m] = res;
}
int bg;
rep (i, 1, m) if (a[i] != 0) {bg = i; break;}
f[bg - 1] = (rec){0, 1}; g[bg - 1] = (rec){INF, 0};
rep (i, bg, m + 1) {
f[i] = (f[i - 1] + a[i]) + (g[i - 1] + (a[i] + 1));
g[i] = (f[i - 1] + (4 - a[i])) + (g[i - 1] + (3 - a[i]));
}
printf("%d\n", f[m + 1].ways);
return 0;
}
bzoj 1111 - 四进制的天平的更多相关文章
- BZOJ 1111: [POI2007]四进制的天平Wag
1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 223 Solved: 151[Submit][St ...
- 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将要用一个天平来称 ...
- T2963 贪吃蛇【BFS,四进制状压,A*】
Online Judge:未知 Label:BFS,四进制状压,暴力,A*,哈希,玄学. 题目描述 给定一个n*m的地图和蛇的初始位置,地图中有些位置有石头,蛇不能经过.当然蛇也不能爬到地图之外. 每 ...
- bzoj 1110 贪心 + 进制转换
思路:感觉脑洞好大啊... 因为每两个砝码其中一个都是另一个的倍数,我们可以知道砝码的种数很少,我们将所有容器的 容量都转换成用这些砝码的重量的进制表示,然后将所有砝码排序,然后贪心地取,取到不能再取 ...
- .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; ...
随机推荐
- PHP无限分类生成树方法,非递归,引用
//这个是核心方法 function generateTree($items){ $tree = array(); foreach($items as $item){ ...
- zookeeper的搭建方法
1.创建三台虚拟机分别在虚拟机上安装Ubuntu16.04Server版的系统. 2.首先选择配置好第一台虚拟机,使用命令vim /etc/hosts对该文件进行修改 3.将zookeeper-3.4 ...
- 笔记-docker-3 使用
笔记-docker-3 使用 1. 镜像 image是docker最重要的概念,docker运行容器前需要本地存在对应的镜像,如果没有,会尝试从默认镜像库下载. 1.1. 镜像获取 查 ...
- Python装饰器探究——装饰器参数
Table of Contents 1. 探究装饰器参数 1.1. 编写传参的装饰器 1.2. 理解传参的装饰器 1.3. 传参和不传参的兼容 2. 参考资料 探究装饰器参数 编写传参的装饰器 通常我 ...
- [bzoj3450]Tyvj1952Easy
瓜皮期望真是弱成渣.. 完全不理解的感觉qwq...题面%了一发千古神犇WJMZBMR哈~ Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化 ...
- 3 网格 landing page
0.大框架 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...
- 在ddms 里面查看data/data里面的东西 不显示data/data
今天我要查看data/anr/tarces.txt,没办法,我只有root手机. 可是root之后,我发现还是不能查看或者导出traces.txt. 后来我才知道,root之后,文件夹权限没有变,所以 ...
- 以最省内存的方式把大图片加载到内存及获取Exif信息和获取屏幕高度和宽度的新方法
我们在加载图片时经常会遇到内存溢出的问题,图片太大,我们加载图片时,一般都是用的如下一般方法(加载本地图片): /** * 不作处理,去加载图片的方法,碰到比较大的图片会内存溢出 */ private ...
- Android学习笔记(四)之碎片化Fragment实现仿人人客户端的侧边栏
其实一种好的UI布局,可以使用户感到更加的亲切与方便.最近非常流行的莫过于侧边栏了,其实我也做过很多侧边栏的应用,但是那些侧边栏的使用我 都不是很满意,现在重新整理,重新写了一个相对来说我比较满意的侧 ...
- Python全栈工程师(每周总结:2)
ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订 ...