975 AlvinZH的1021实验

思路

贪心,简单题。

题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的。先找到最大需要的砝码Wi,问题变成了表示(n-Wi),可递归,可循环。见看考代码一。

本题亦可联想到三进制,思路清奇。可以参考段柯宇同学的题解。

分析

简单讲讲为什么,贪心在哪里。令W[6]={1,3,9,27,81,243}表示砝码重量,Sum[6] = {1,4,13,40,121,364}表示前i个砝码总和。

可以发现W[i+1]=Sum[i]*2+1(i∈[0,4]),这表明若Sum[i-1]<n≤Sum[i],能用的最大砝码只能是W[i]。如果最大使用W[i+1],就算减去所有更小的(即-Sum[i])结果依然大于W[i];如果最大使用W[i-1],就算加上所有更小的(即+Sum[i-2])变成Sum[i-1],亦不能表示n。所以判断最大使用的一定是W[i],而且是输出正的W[i],废话!

接下来用n-W[i]后,问题就变成了表示(n-Wi),负数并不是问题,变成正数,输出取负可解决。

参考代码一

//
// Created by AlvinZH on 2017/10/22.
// Copyright (c) AlvinZH. All rights reserved.
// #include <cstdio>
const int Weight[6] = {1,3,9,27,81,243};
const int Sum[6] = {1,4,13,40,121,364}; int main()
{
int n;
while(~scanf("%d", &n))
{
int flag = 0;
int i = 0; while(n > 0)
{
for (i = 0; i < 6; ++i) {
if(n <= Sum[i])
break;
} if(flag == 0)//第一个数
{
n -= Weight[i];
printf("%d", Weight[i]);
}
if(flag == 1) {
n -= Weight[i];
printf("+%d", Weight[i]);
}
if(flag == -1) {
n = Weight[i] - n;
printf("-%d", Weight[i]);
} if(n > 0) flag = 1;
else if(n < 0)
{
flag = -1;
n = -n;
}
}
printf("\n");
}
}

2016级算法第四次上机-C.AlvinZH的1021实验的更多相关文章

  1. 2016级算法第四次上机-D.AlvinZH的1021实验plus

    978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需 ...

  2. 2016级算法第四次上机-F.AlvinZH的最“长”公共子序列

    940 AlvinZH的最"长"公共子序列 思路 DP,难题. \(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数. 初始化:dp[i][0] ...

  3. 2016级算法第四次上机-E.Bamboo and the Ancient Spell

    Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...

  4. 2016级算法第四次上机-B ModricWang的序列问题

    1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...

  5. 2016级算法第四次上机-G.ModricWang的序列问题 II

    1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...

  6. 2016级算法第四次上机-A.Bamboo 和人工zz

    Bamboo和人工ZZ 题意: 非常直白,经典的动态规划矩阵链乘问题 分析: 矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价. 一个pq的矩阵和一个qr的矩阵相乘,计算代价为pq ...

  7. 2016级算法第六次上机-F.AlvinZH的学霸养成记VI

    1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...

  8. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  9. 2016级算法第六次上机-D.AlvinZH的学霸养成记V

    1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...

随机推荐

  1. spring+springmvc+mybatis+redis实现缓存

    先搭建好redis环境 需要的jar如下: jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:330 ...

  2. Openssl base64命令

    一.简介 对文件件进行base64的编码与解码 二.语法 openssl base64 [-in filename] [-out filename] 三.实例 1.二进制文件与base64编码互转 o ...

  3. p2319 [HNOI2006]超级英雄

    传送门 分析 从1道m进行匹配,找到第一个不能继续匹配的点即可 代码 #include<iostream> #include<cstdio> #include<cstri ...

  4. c#反射优化 表达式树

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  5. Docker 实现的 redis 主从

    计划用 Docker 实现 Redis 的主从,简单主从而已.主的名称叫 redis-master 一步步来. 先新建个Dockerfile ,从alpine 开始,比较简单. FROM alpine ...

  6. mariadb主从备份

    mariadb主从备份 master主库配置 停止mariadb systemctl stop mariadb 修改配置文件my.conf vim /etc/my.cnf [mysqld] serve ...

  7. 编写高质量代码改善C#程序的157个建议——建议82:Parallel简化但不等同于Task默认行为

    建议82:Parallel简化但不等同于Task默认行为 建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用.也就是说,在运行Paralle ...

  8. 年年岁岁花相似,岁岁年年人不同。——linux课程初探

    写在前面 记得大约两年以前第一次学习linux,当初的目的还仅仅是学习操作系统,后来慢慢开始写linux内核代码,慢慢学会重构与代码的维护.在娄老师课上感觉这些工具是如此亲切和熟悉,没错这些曾经被我抛 ...

  9. Python3常见Exception

    异常                                     描述BaseException                    新的所有异常类的基类Exception        ...

  10. Java泛型(泛型接口、泛型类、泛型方法)

    转载 转载出处:https://www.cnblogs.com/JokerShi/p/8117556.html 泛型接口: 定义一个泛型接口: 通过类去实现这个泛型接口的时候指定泛型T的具体类型. 指 ...