题目链接:http://codeforces.com/problemset/problem/349/B

题目大意

小明要从9个数字(1,2,……,9)去除一些数字拼接成一个数字,是的这个数字最大。

但是小明每取一个数字i就会消耗a[i]点体力,小明目前总共有v点体力。

举个例子:

小明如果有5点体力,而a[1]到a[9]的数值依次为:

5 4 3 2 1 2 3 4 5

那么最好的办法就是取5次数字5,因为a[5]=1最小,所以最终得到的数字是11111,比起其他的取数策略所得到的数字都要大。

分析

这道题目可以采用贪心的策略。

要让数字尽可能地大,我们首先想到的应该是让这个数字尽可能地“长”,所以我们会下意识的去选 a[i]最小并且i最大 的那个数字i,我们在这里设这个i为x,表示a[x]是数组a中最小的数的坐标组成的集合中(因为a[i]==min(a[i])的数可能不止一个)对应的坐标最大的那个坐标。

如果这个策略导致v % a[i] == 0 的话,那么这个结果就是我们想要的结果。

但是还存在一个情况,如果v == 17 && i == 8并且a[9] == a[8]+1的话,我们采用之前的方法得到的是“88”,但是其实结果可以是“98”,因为我们可以用“9”代替结果中的第一个“8”。

所以在通过初始方法获得基本数字之后,我们还要从9遍历到x+1,看看这些数字是否可以一次代替首位的x,第二位的x,……,直到不能替代为止。

还有一点可能感到困惑的情况是:可能会有同学会觉得这个方法会有错误,其实我们是可以推断的,因为a[x]已经是最小的了,所以最终结果的位数肯定是⌊v / a[x]⌋,在这种情况下,我们只需考虑尽可能地让这个数字的越高位尽可能地大即可,这也是贪心算法所在。

实现

C++代码实现:

#include <iostream>
using namespace std;
int v, a[10], x = 1, y = 0;
int main() {
cin >> v;
for (int i = 1; i <= 9; i ++) {
cin >> a[i];
if (a[i] <= a[x])
x = i;
}
int left = v % a[x];
int cnt = v / a[x];
for (int i = 9; i > x && cnt;) {
if (a[i] <= left + a[x]) {
cout << i;
cnt --;
left -= a[i] - a[x];
}
else {
i --;
}
}
if (cnt == 0) {
cout << -1 << endl;
} else {
while (cnt --) {
cout << x;
}
cout << endl;
}
return 0;
}

【贪心】Codeforces 349B.Color the Fence题解的更多相关文章

  1. codeforces 349B Color the Fence 贪心,思维

    1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1 ...

  2. Codeforces 349B - Color the Fence

    349B - Color the Fence 贪心 代码: #include<iostream> #include<algorithm> #include<cstdio& ...

  3. CodeForces 349B Color the Fence (DP)

    题意:给出1~9数字对应的费用以及一定的费用,让你输出所选的数字所能组合出的最大的数值. 析:DP,和01背包差不多的,dp[i] 表示费用最大为 i 时,最多多少位,然后再用两个数组,一个记录路径, ...

  4. Codeforces D. Color the Fence(贪心)

    题目描述: D. Color the Fence time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. 349B - Color the Fence

    Color the Fence Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  6. codeforces B. Color the Fence 解题报告

    题目链接:http://codeforces.com/problemset/problem/349/B 题目意思:给定v升的颜料和9个需要花费ad 升的颜料,花费ad 升的颜料意味着得到第d个数字,现 ...

  7. NYOJ-791 Color the fence (贪心)

    Color the fence 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Tom has fallen in love with Mary. Now Tom w ...

  8. nyoj 791——Color the fence——————【贪心】

    Color the fence 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 Tom has fallen in love with Mary. Now Tom w ...

  9. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

随机推荐

  1. MYSQL数据库学习十七 日志管理

    17.1 MySQL软件所支持的日志 MySQL所支持的日志文件里,除了二进制日志文件外,其他日志文件都是文本文件.默认情况下,MySQL只会启动错误日志文件,其他日志文件则需要手动启动. 二进制日志 ...

  2. spring-boot 多模块化项目和EurekaServer的搭建

    Spring boot由于其 1.易于开发和维护.2.单个微服务启动快.3.局部修改部署容易.4.技术栈不受语言限制等优点受到越来越多公司的重视.spring-boot还集成了许多关于微服务开发的框架 ...

  3. java中有关流操作的类和接口

    一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...

  4. Git忽略规则.gitignore梳理

    对于经常使用Git的朋友来说,.gitignore配置一定不会陌生.废话不说多了,接下来就来说说这个.gitignore的使用. 首先要强调一点,这个文件的完整文件名就是".gitignor ...

  5. 微信app支付详细教程

    微信支付作为三大支付之一,越来越多的客户要求产品中添加微信支付   但是网上能找到可用的demo很少 所以写一篇自己写微信支付的过程,希望能给有需要的开发者一点帮助. 下面让我们来进入正题 1准备工作 ...

  6. python全栈开发-Day12 三元表达式、函数递归、匿名函数、内置函数

    一. 三元表达式 一 .三元表达式 仅应用于: 1.条件成立返回,一个值 2.条件不成立返回 ,一个值 def max2(x,y): #普通函数定义 if x > y: return x els ...

  7. 2018上C语言程序设计(高级)博客作业样例

    要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...

  8. bug终结者 团队作业第三周

    bug终结者 团队作业第三周 团队展示 队名 bug终结者 队员风采: 杨京典 20162302 风格:先构建框架,在一 一实现,在实现的过程中不断测试和修改. 擅长的技术:拆分问题,使用相对简单的思 ...

  9. Beta冲刺 第四天

    Beta冲刺 第四天 1. 昨天的困难 1.网页使用了一些网上现成的模板,其主要是使用像素做处理的,所以检查起来比较费事费力. 2.使用github代码merge时出现了问题.所以花费了不少的时间在人 ...

  10. 201621123040《Java程序设计》第2周学习总结

    1.本周学习总结 关键词:Java中的字符串与数组 c语言基本语法的迁移 相关总结:在一周的学习过程中,我自主学习Java的基本语法,前期的相关语法与c语言的基本语法相近,也算是做到了很好的回顾:在郑 ...