1111: [POI2007]四进制的天平Wag

链接

题意:

  用一些四进制数,相减得到给定的数,四进制数的数量应该尽量少,满足最少的条件下,求方案数。

分析:

  这道题拖了好久啊。

  参考Claris的博客。

首先将四进制数转化为四进制数。

一种的可行构造方案是四进制数上每一位的和。例如:$(003)_4$可以有3个$4^0$的砝码组成,当然也可以向前一位借位,$(010)_4-(001)_4$,此时就需要2个砝码了。

所以可以推出:每位最多借一位,最高位最高是n+1位。所以可以dp表示当前是否借位过。

f[i]表示到第i位,不向i+1借位的数字最少的个数,以及方案数。g[i]表示向i+1借位。即i+1位的一个数变成4个i位的数字,然后做差。(此处不管是否向高位借位,都不记录高位的贡献)

$f[i] = merge(f[i - 1] + b[i] ,g[i - 1] + b[i] + 1)$

$g[i] = merge(f[i - 1] + 4 - b[i], g[i - 1] + 3 - b[i])$

第一个转移方程表示当前这一位不向高位借位:

  1、如果低位也不向它借位,低位自己的答案是f[i-1],那么只需要b[i]个$4^i$的砝码即可组成这一位的答案。

  2、如果低位向它借位,低位的答案g[i-1],本来b[i]个即可满足,现在需要再增加一个给低位。例如:样例$(2212)_4$到第二位时,如果第一位向它借位,那么第一位的砝码是4-1-1=2,这一位的砝码是4,所以共3个。

第二个转移方程表示当前这一位不向高位借位:

  • 1、如果低位不向它借位,同样加上f[i-1],而它需要4-b[i]个重为$4^i$的砝码。

  • 2、如果低位向它借位,同样加上g[i-1],它需要3-b[i]个重为$4^i$的砝码,其中一个给了下一位了,那么此时是否还满足呢?样例$(2212)_4$到第二位时,借位后是16-4-4-4=4,下一位也要借位是4-1-1=2,中间其实可以消掉一个,二式相加得到16-4-4-1-1=6,刚好满足前两位的和是6

代码:

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<bitset>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
char s[N];
int a[N], b[N];
struct Node{
int x, y;
Node() {}
Node(int _x,int _y) { x = _x, y = _y; }
Node operator + (int a) { return Node(x + a, y); }
Node operator + (Node A) {
if (x == A.x) return Node(x, (y + A.y) % );
return x < A.x ? *this : A;
}
}f[N], g[N]; int main() {
scanf("%s", s + );
int len = strlen(s + ), n = ;
for (int i = ; i <= len; ++i) a[i] = s[len - i + ] - ''; while (len) { // 分解为四进制数,每次找到模4剩下的余数
a[] = ;
for (int i = len; i; --i)
a[i - ] += (a[i] & ) * , a[i] >>= ; // 第i位模4后的余数,到下一位乘10
b[++n] = a[] / ;
for (; len && !a[len]; len --);
} n ++;
f[] = Node(, ); g[] = Node(1e9, );
for (int i = ; i <= n; ++i) { // 从低位往高位dp
f[i] = (f[i - ] + b[i]) + (g[i - ] + (b[i] + ));
g[i] = (f[i - ] + ( - b[i])) + (g[i - ] + ( - b[i]));
}
cout << f[n].y;
return ;
}

1111: [POI2007]四进制的天平Wag的更多相关文章

  1. BZOJ 1111: [POI2007]四进制的天平Wag

    1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 223  Solved: 151[Submit][St ...

  2. bzoj 1111 [POI2007]四进制的天平Wag 数位Dp

    1111: [POI2007]四进制的天平Wag Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 302  Solved: 201[Submit][St ...

  3. BZOJ1111 : [POI2007]四进制的天平Wag

    POI2007完结撒花~ 首先将n转化为四进制,从低位到高位DP f[i]表示这一位不向下一位借位 g[i]表示这一位向下一位借位,但借的那个不算在i f[0]=0,g[0]=inf f[i]=mer ...

  4. [POI2007]四进制的天平Wag

    Description Mary准备举办一个聚会,她准备邀请很多的人参加她的聚会.并且她准备给每位来宾准备一些金子作为礼物.为了不伤及每个人的脸面,每个人获得的金子必须相同.Mary将要用一个天平来称 ...

  5. bzoj 1111 - 四进制的天平

    Description 给定 1000的十进制数, 求 最小的 四幂拆分 方案 有多少种 Solution 先大除法 \(n\log_4(n)\)次取余转化为 四进制数. 然后从 低位 往 高位 \( ...

  6. T2963 贪吃蛇【BFS,四进制状压,A*】

    Online Judge:未知 Label:BFS,四进制状压,暴力,A*,哈希,玄学. 题目描述 给定一个n*m的地图和蛇的初始位置,地图中有些位置有石头,蛇不能经过.当然蛇也不能爬到地图之外. 每 ...

  7. .net 获取时间十二进制与二十四进制

    [说明] visual studio工具,.net项目,获取时间 [易错问题] ①二十四小时制(HH小时大写) System.DateTime.Now.ToString("yyyy-MM-d ...

  8. java进制转换器 图形用户界面 十进制及其相反数分别转化为二,四,八,十六进制

    package com.rgy.Test; import java.awt.Color; import java.awt.FlowLayout; import java.awt.GridLayout; ...

  9. Java【第二篇】基本语法之--进制、运算符

    进制 对于整数,有四种表示方式: 二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头. 十进制:0-9 ,满 10 进 1. 八进制:0-7 ,满 8 进1. 以数字 0 开头表示. 十六进制 ...

随机推荐

  1. Linux下的GPT分区

    GPT分区 这是另外一种分区,针对MBR分区,它有很多优点: (1)几乎突破了分区个数的限制. 在GPT分区表中最多可以支持128个主分区. (2)单个分区容量几乎没有限制. 单个分区最大支持1EB容 ...

  2. BZOJ1089:[SCOI2003]严格n元树(DP,高精度)

    Description 如果一棵树的所有非叶节点都恰好有n个儿子,那么我们称它为严格n元树.如果该树中最底层的节点深度为d (根的深度为0),那么我们称它为一棵深度为d的严格n元树.例如,深度为2的严 ...

  3. 【[SDOI2017]序列计数】

    感觉自己的复杂度感人 大概是\(O(p*\pi(m)+p^3logn)\) 还是能过去的 我们看到这么大的数据范围还是应该先想一想暴力怎么写 显然我们可以直接暴力\(dp\) 设\(dp[i][j]\ ...

  4. Asp.net Web Api添加异常筛选器

    一.定义一个异常筛选器 using System;using System.Collections.Generic;using System.Linq;using System.Web;using S ...

  5. [19/04/26-星期五] GOF23_结构型模式(桥接模式、组合模式)

    一.桥接模式(bridge) 场景:商城系统中常见的商品分类,以电脑为例,首先想到使用多层继承结构. —— 台式机(联想台式机.戴尔台式机.神舟台式机) 电脑    ——笔记本(联想笔记本.戴尔笔记本 ...

  6. CSS动画总结效果

       CSS3添加了几个动画效果的属性,通过设置这些属性,可以做出一些简单的动画效果而不需要再去借助JavaScript.CSS3动画的属性主要分为三类:transform.transition以及a ...

  7. js实现限制上传文件大小

    <html> <head> <script type="text/javascript"> var isIE = /msie/i.test(na ...

  8. DPI在SDN中的部署方式

    目录 在sdn中的部署分类 将DPI部署到基础设施层 将DPI部署到控制层 将DPI部署到应用层 个人总结 参考文献 在sdn中的部署分类 DPI 可以分别部署到SDN的基础设施层.控制层和应用层. ...

  9. 大话Linux内核中锁机制之信号量、读写信号量

    大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实 ...

  10. Oracle分析函数(一)

    (一)分析函数语法 function_name(<argument>,<argument>...) over(<partition by clause><or ...