poj_2709 贪心算法
poj 2709 painter
题目要求
给定涂料,每套涂料含有3-12种不同的颜色(开始时候给定选用的颜料套的颜色数目),
且一套涂料中每种颜色均有50ml。且一套涂料中的任意三种不同的颜色各X ml混合都可以获得 灰色颜料 X ml。
现在给定需要的各个颜色的数量(这些颜色都属于同一套颜料),以及需要的灰色颜色的数量。
求最少需要多少套颜料才能获得这些颜色。
题目分析
直觉告诉我们,使用贪心算法可以解决这个问题。通过使用最多量的颜色可以获得至少需要的颜
料的套数 minset, 用minset*50 减去这些颜色的数量,得到使用min_set的套数的颜料之后剩余的颜色的 数量。之后,使用贪心算法,每次选择剩余数量最多的三种颜色进行混合,这样做可以使得剩余的颜色的数目最
多,从而使得之后的配色有更多的选择;那么考虑每次混合数量最多的三种颜色的时候混合多少?
发现,每次只混合1 ml的灰色颜色可以保证正确性,而每次混合大于1ml的数量的灰色颜色,则无法保证正确性 (每次混合多少的灰色颜色应该是可以算出来的,但是不知道怎么去做。。。)
实现代码
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define MAX_NUM 13
int paint[MAX_NUM];
int bottle[MAX_NUM];
bool cmp(const int a, const int b){
return a > b;
}
int Resolve(int n, int gray_volume){
sort(paint, paint + n, cmp);
int min_bot = paint[0] / 50 + int(paint[0] % 50 != 0);
int result = min_bot;
if (gray_volume <= 0){
return result;
}
for (int i = 0; i < n; i++){
paint[i] = min_bot * 50 - paint[i];
}
sort(paint, paint + n, cmp);
while (gray_volume){
if (paint[2] == 0){
for (int i = 0; i < n; i++){ //如果还有剩余的颜色的数目小于三种,则增加一套颜料
paint[i] += 50;
}
result++;
}
paint[0] --; //每次只减少 1ml的量
paint[1] --;
paint[2] --;
gray_volume--;
sort(paint, paint + n, cmp);
}
return result;
}
int main(){
int n, gray;
while (true){
cin >> n;
if (n == 0){
break;
}
for (int i = 0; i < n; i++){
cin >> paint[i];
}
cin >> gray;
cout << Resolve(n, gray) << endl;
}
return 0;
}
poj_2709 贪心算法的更多相关文章
- 贪心算法(Greedy Algorithm)
参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...
- 算法导论----贪心算法,删除k个数,使剩下的数字最小
先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...
- LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]
Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...
- ACM_ICPC hdu-2111(简单贪心算法)
一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...
- 增强学习贪心算法与Softmax算法
(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...
- 【九度OJ】题目1434贪心算法
题目 本题的贪心算法策略需要深入思考一下 看到题目,最初没有理解题目的要求:看尽量多的完整的节目.尽量多是指数量多,自己理解成观看的时间最长.这样想其实简化了这道题. 正确理解题意后,首先想到的想法是 ...
- 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)
//贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
随机推荐
- 线程安全的atomic wrapper classes例子
先参考一个例子 http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html#!comments 即使只是i++,实际上也是由多个原子 ...
- hive thrift 开机启动
这个问题困扰我很久,之前redis的时候,也出现了这个问题,从网上找的thrift脚本没有一个好使的,最后通过修改/etc/rc.d/rc.local来执行一些非服务的命令,这样子就不需要像写服务那样 ...
- 分享一下自己写的Python 3的各种PDF文档【花了半年时间那】
这些文档花了我半年的时间去整理.因为是第一次进行整理,希望帮助后来者少走弯路.毕竟是第一次整理.哪些地方不到位,希望大家和我练习,我们一起把它做好,以下就直接给出下载地址了,都是免积分的下载奥.因此. ...
- java-el+jstl+jsbc综合示例
项目结构: 项目展示: 数据库: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.5.53 : Database - product ************ ...
- dvi 中的内容居中
text-align:right; 文本居中 line-height:35px;*垂直居中*
- js导出execl
var idTmr; function ExportExcel(tableid) {//整个表格拷贝到EXCEL中 var curTbl = document.getElementById(table ...
- 探索Java语言与JVM中的Lambda表达式
Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法.( ...
- 【转】DWM 窗体玻璃效果实现
我一直盼望着 Windows 新版本的发布.令人感兴趣的事情莫过于浏览 MSDN® 和 SDK 文档,查找一些可以利用和依赖的最新创新,然后让朋友和同事以及您的老板(如果幸运的话)大开眼界.Windo ...
- MFC CreateWindow介绍
CreateWindow 该函数创建一个重叠式窗口.弹出式窗口或子窗口.它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的).函数也指该窗口的父窗口或所属窗口(如果存在的话),及窗口的 ...
- REFLECTOR和FILEDISASSEMBLER的下载与使用
.NET Reflector 下载地址 http://www.aisto.com/roeder/dotnet FileDisassembler 下载地址 http://www.denisbauer.c ...