题目链接: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. 【Flask】 Jinja2模板语言

    Jinja2 Jinja2是Python Web编程中的主流模板语言.因为flask是基于Jinja2和Werkzeug发展而来,在安装flask的时候jinja2自动就被装在上面了. 之前提到了很多 ...

  2. [css 实践篇] 解决悬浮的<header> <footer>遮挡内容的处理技巧

    我写的实践篇 都是自己在实践项目所遇到的 "拦路虎" 还是很有借鉴的意义的.(实践才是检验真理的唯一标准呀),废话不多说,进去正题 position: fixed 绝对固定底部后会 ...

  3. 多线程 Synchronized关键字和Lock

    Synchronized  分为实例锁和全局锁. 实例锁为 synchronized(this) 和 非static synchronized方法.   也加对象锁. 只要一个线程访问这类的一个syn ...

  4. JSP、Servlet、JDBC学习笔记

    WEB的学习 * 服务器 * 网络的架构(面试题) * C/S client/server 客户端/服务器端 例子:QQ 快播 暴风影音 * 优点:交互性好,服务器压力小. * 缺点:客户端更新了,下 ...

  5. Leetcode 12——Integer to Roman

    12.Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be withi ...

  6. JavaScript(第六天)【函数】

    函数是定义一次但却可以调用或执行任意多次的一段JS代码.函数有时会有参数,即函数被调用时指定了值的局部变量.函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值. 一.函数声明   函 ...

  7. Git简单图文教程

    环境: Windows [版本 10.0.15063]64位 Git-2.14.1 64位[下载] TortoiseGit-2.5.0.0 64位[下载],这是一个Git 客户端,外号"乌龟 ...

  8. 2017-2018-1 20155306 mypwd的实现

    2017-2018-1 20155306 mypwd的实现 一.pwd的使用 功能: Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 命令格式:pwd [选项] 命 ...

  9. PTA題目的處理(三)

    题目7-1 高速公路超速處罰 1.實驗代碼 #include <stdio.h> //#include <stdlib.h> int main() { int csp,lsp; ...

  10. Beta冲刺Day4

    项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...