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. linux系统如何安装vmware Tools(下面以CentOS为例)

    VMwareTools是VMware虚拟机中很重要的一个工具包,有些时候在虚拟机中安装完操作系统会缺少网卡驱动,不能上网,这时只要安装VMwareTools就可以解决问题,下面以CentOS为例,来说 ...

  2. centos7如何知道jdk的在哪个目录

    今天一个小实验需要安装jdk,用命令Java -version查询了一下,原来Centos7自带OpenJDK的环境,但是需要手动配置/etc/profile文件,于是开始找java的安装路径.... ...

  3. springmvc框架简单搭建

    一.利用xml 配置 1.web.xml   <web-app version="2.4"     xmlns="http://java.sun.com/xml/n ...

  4. Centos7下安装与卸载Jdk1.8

    安装 去官网下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 使用xs ...

  5. javascript总结48:正则表达式(RegExp)

    1 正则表达式(英语:Regular Expression) 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符 ...

  6. Matlab SLAM

    https://www.baidu.com/s?wd=Matlab%20SLAM&rsv_spt=1&rsv_iqid=0xfacaed5e00006d4e&issp=1&am ...

  7. 编写高质量代码改善C#程序的157个建议——建议151:使用事件访问器替换公开的事件成员变量

    建议151:使用事件访问器替换公开的事件成员变量 事件访问器包含两部分内容:添加访问器和删除访问器.如果涉及公开的事件字段,应该始终使用事件访问器.代码如下所示: class SampleClass ...

  8. 编写高质量代码改善C#程序的157个建议——建议95:避免在构造方法中调用虚成员

    建议95:避免在构造方法中调用虚成员 在构造方法中调用虚方法会带来一些意想不到的错误,虽然这种方法不常见,但还是需要注意这类陷阱. static void Main() { American amer ...

  9. 关于Qt官方下载页的最新变动

    时间过得很快,现在Qt已经迎来了5.10版本,但是当我们去下载页下载对应安装包的时候,已经找不到之前的offline安装包了.你能够看到的只有在线安装包,并且我自己有做过测试,国内的网络基本上没有机会 ...

  10. Retrofit+Rxjava observable转javabean失败

    报错提示: Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex. ...