codeforces B. Color the Fence 解题报告
题目链接:http://codeforces.com/problemset/problem/349/B
题目意思:给定v升的颜料和9个需要花费ad 升的颜料,花费ad 升的颜料意味着得到第d个数字,现在要求在所有的花费不超过v升的情况下,使得这些数字组合起来是最大的。
一开始直接从最小花费的颜料着手,如果花费的颜料是相同的,就转到从d(也就是位数)最大贪心。这样测试9就开始卡住了。
受到乌冬兄的指点迷津,终于有了思路,陆陆续续改了很多次,终于过了。以下摘自他的语录,白话文,大家请谅解:
稳用颜料最少,最大的数字,先保证位数最长,然后再将剩余颜料从大数字开始贪心
因为要数最大,所以根据“数”的比较顺序:
1。比较位数
2。从高位开始比较
从数字比较的方法,推出贪心既思路
由于本人悟性太低,下面是更详细的解说:
1、先稳到用最小颜料既数字d,假设它价值为c
2、先构造出s = v div c个d,求出剩余颜料r = v mod c
3、从最高位扫描s,从大到小枚举可替换数字d' >= d,假设价值为c':若c'-c <= r,则替换当前位置的d为d', r -= c' - c
4、最后得出替换后的s, s'即为所求
注意:价值即一个数字要使用的颜料量
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 1e6 + ;
struct paint
{
int index; // 数字
int num; // 该数字所花费的颜料量
} a[maxn], b[maxn]; int s[maxn]; // 用于保存结果 int cmp(paint a, paint b)
{
if (a.num != b.num) // 先保证用的颜料量最少
return a.num < b.num;
return a.index > b.index; // 再保证数字最大
} int main()
{
int i, j, v, tmp, t1;
while (scanf("%d", &v) != EOF)
{
// freopen("in.txt", "r", stdin);
for (i = ; i <= ; i++)
{
a[i].index = i;
scanf("%d", &a[i].num);
b[i].index = i; //b用于保存未排序前的序列,以便下面从大数字开始枚举
b[i].num = a[i].num;
}
sort(a+, a+, cmp);
if (v < a[].num) // v比最少花费的颜料更少
printf("-1\n");
else
{
tmp = v / a[].num; // 得出最大位数
if (v % a[].num == ) // 如果刚好可以除尽,最大的数就是tmp个a[1].num的数。
{
for (i = ; i < tmp; i++)
printf("%d", a[].index);
printf("\n");
}
else
{
for (i = ; i < tmp; i++)
{
s[i] = a[].index; // 先得出目前来说最长的数字,但可能不是最终结果
}
int r = v % a[].num; // 余数
t1 = r;
for (i = ; i < tmp; i++)
{
for (j = ; j >= ; j--) // 从最大的位数开始枚举
{
if (b[j].num - a[].num <= r && a[].index < b[j].index) // 没有超过余数且数字比原来的排列数字的位数要大
{
s[i] = b[j].index;
r = r - (b[j].num - a[].num); // 余数要有所减少
break;
}
}
}
if (t1 == r) // 如果根本没有可替换的数,那么就和刚好除尽的是同一种情况
{
for (i = ; i < tmp; i++)
printf("%d", a[].index);
printf("\n");
}
else
{
for (i = ; i < tmp; i++) // 否则有替换的就输出新的最大数字
{
printf("%d", s[i]);
}
printf("\n");
}
}
}
}
return ;
}
codeforces B. Color the Fence 解题报告的更多相关文章
- codeforces 349B Color the Fence 贪心,思维
1.codeforces 349B Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1 ...
- Codeforces Educational Round 92 赛后解题报告(A-G)
Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- POJ 2054 Color a Tree解题报告
题干 Bob is very interested in the data structure of a tree. A tree is a directed graph in which a spe ...
- Codeforces Round #382 (Div. 2) 解题报告
CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...
- Codeforces 349B - Color the Fence
349B - Color the Fence 贪心 代码: #include<iostream> #include<algorithm> #include<cstdio& ...
- Codeforces D. Color the Fence(贪心)
题目描述: D. Color the Fence time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- codeforces B.Fence 解题报告
题目链接:http://codeforces.com/problemset/problem/363/B 题目意思:给定整数n和k,需要从n个数中找出连续的k个数之和最小,输出这连续的k个数中的第一个数 ...
- 【LeetCode】276. Paint Fence 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetco ...
随机推荐
- 【ZOJ 3502】Contest
题 题意 n个问题,解决的顺序影响正确的概率,无论之前解决的问题是否答对,当前问题 j 答对概率为max{a[i][j]} (i为解决过的问题).求答对题目的最大期望和对应的答题顺序.T组测试,T ( ...
- 16.(转) Android之Support v4、v7、v13的区别和应用场景
我们在项目中经常会碰到Android Support v4.v7和v13包兼容问题,所以有必要梳理下这些东西. google提供了Android Support Library package 系列的 ...
- javaScript基础练习题-下拉框制作
1.基础回顾 如何让一个段javascript在文档加载后执行,(因为自己忘了,所以顺便复习一下) window.onload = function(){}; <!DOCTYPE html PU ...
- Treap实现山寨set
treap插入.删除.查询时间复杂度均为O(logn) treap树中每个节点有两种权值:键值和该节点优先值 如果只看优先值,这棵树又是一个堆 treap有两种平衡方法:左旋&右旋 inser ...
- eclipse中新建python项目报错:Project interpreter not specified
eclipse-windows-preferences-python
- ISO 基础之 (十二) 文件管理
一 文件管理 沙盒:让每个APP应用在手机上有一个独立的文件夹,相互之间不能访问. 沙盒目录:NSHomeDirectory() library: 库文件 tmp: 临时文件 1.NSData 也是一 ...
- MyEclipse------如何在特定目录下创建文件夹
Directory.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...
- sleep()
经常看到线程中用sleep(),到底是什么用处,下面讲的比较通俗: 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: ...
- MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法
MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法 1 问题 [root@localhost m ...
- 人工神经网络(ANN)
参考资料:http://www.cnblogs.com/subconscious/p/5058741.html 从函数上来看,神经网络是回归方程的级联叠加,用来逼近目标函数的,本质是一种模拟特征与目标 ...