Painter
描述
杂货店出售一种由N(3<=N<=12)种不同颜色的颜料,每种一瓶(50ML),组成的颜料套装。
你现在需要使用这N种颜料;不但如此,你还需要一定数量的灰色颜料。
杂货店从来不出售灰色颜料——也就是它不属于这N种之一。幸运的是,灰色颜料是比较好配置的,如果你取出三种不同颜色的颜料各x ml,混合起来就可以得到xml的灰色颜料(注意不是3x)。
现在,你知道每种颜料各需要多少ml。你决定买尽可能少的“颜料套装”,来满足你需要的这N+1种颜料。
那么你最少需要买多少个套装呢?
输入
输入包含若干组测试数据。每组数据一行:第一个数N, 3<=N<=12, 含义如上;
接下来N+1个数,分别表示你需要的N+1种颜料的毫升数。最后一种是灰色。所有输入的毫升数<=1000.
当某一行为0时代表输入终止
注意:输入中不存在每个颜料套装的毫升数。由题意可知,每种各50ml,即一共50N ml
输出
每组数据输出一行,最少需要的套装数。
- 样例输入
-
3 40 95 21 0
7 25 60 400 250 0 60 0 500
4 90 95 75 95 10
5 0 0 0 0 0 333
0 - 样例输出
-
2
8
2
4
这题的难点在于已知各种颜料剩余量,求能够合成的灰色颜料的重量,想了好久,终于得出如下结论#include "bits/stdc++.h"
using namespace std;
const int INF = 0x3f3f3f3f;
int arr[];
int n, gray, ans, rest;
bool cmp(int n, int m) {
return n > m;
}
int getGray(int m) {
int ans = INF;
// 第一种情况是所以多余出来的颜料的总量除3
// 按n = 4举例 3 4 5 6 能合除 6ml 的灰色颜料
ans = min(ans, (rest + m * n * ) / );
// 第二种情况是剩余量最多的那种颜料合完灰色还有多余
// 按n = 4举例 3 4 5 100 能合除 6ml 的灰色颜料
ans = min(ans, (rest - arr[] + m * (n - ) * ) / );
// 第三种情况是剩余量最多的两种颜料合完灰色还有多余
// 按n = 4举例 3 4 100 100 能合出 7ml 的灰色颜料
ans = min(ans, rest - arr[] - arr[] + m * (n - ) * );
return ans;
}
int main() {
while (scanf("%d", &n) && n) {
int mx = ;
for (int i = ; i < n; i++) {
scanf("%d", &arr[i]);
// 找到需求最多的颜料的重量
mx = max(mx, arr[i]);
}
scanf("%d", &gray);
// 不考虑灰色要买的套装数量
ans = mx % ? mx / + : mx / ;
rest = ;
for (int i = ; i < n; i++) {
// 记录第i种颜料多余出来的重量
arr[i] = ans * - arr[i];
// 记录多余出来的颜料的总重量
rest += arr[i];
}
// 按多余出来的重量降序排序
sort(arr, arr + n, cmp);
// i是考虑灰色还需要再购买的套装数
for (int i = ; ; i++) {
if (getGray(i) >= gray) {
printf("%d\n", ans + i);
break;
}
}
}
return ;
}感觉像是ZOJ3778的一个加强版
Painter的更多相关文章
- HDOJ 题目2474 String painter(区间DP)
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- little tips of painter.drawRect in Qt
一个QImage或QPixmap新建变量时,第一次填充图片时设置的宽高正常(fill),其后的绘制操作(draw)则会在绘制的矩形底边和右边加上painter.pen().width() 在下面代码1 ...
- HT for Web 中Painter的介绍及用法
鉴于许多同学对Painter不熟悉,所以撰写此文介绍下.Painter的中文意思是画家.漆工,那放到HT里是什么意思呢?很简单,这是HT特有的一种接口,允许开发者在拓扑及其它通用组件上使用Canvas ...
- hdu2476 String painter(区间dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2476 Problem Description There are two strings ...
- Corel Painter 15在Surface Pro 4下开启笔触压力感应
之前一直是用Wacom的板子,所以只需要下载Wacom板子相应的驱动安装即可就能在PS和Corel Painter中开启压力感应来调节笔触出线的粗细.Surface Pro 4的笔是支持压力感应的,但 ...
- 模拟+思维 HDOJ 5319 Painter
题目传送门 /* 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最 ...
- poj 1681 Painter's Problem
Painter's Problem 题意:给一个n*n(1 <= n <= 15)具有初始颜色(颜色只有yellow&white两种,即01矩阵)的square染色,每次对一个方格 ...
- ZRender源码分析4:Painter(View层)-中
回顾 上一篇说到:ZRender源码分析3:Painter(View层)-上,接上篇,开始Shape对象 总体理解 先回到上次的Painter的render方法 /** * 首次绘图,创建各种dom和 ...
- ZRender源码分析3:Painter(View层)-上
回顾 上一篇说到:ZRender源码分析2:Storage(Model层),这次咱看来看看Painter-View层 总体理解 Painter这个类主要负责MVC中的V(View)层,负责将Stora ...
- The Painter's Partition Problem Part II
(http://leetcode.com/2011/04/the-painters-partition-problem-part-ii.html) This is Part II of the art ...
随机推荐
- 35. docker swarm dockerStack 部署 投票应用
1. 编写 docker-compose.yml # docker-compose.yml version: "3" services: redis: image: redis:a ...
- The mplot3d Toolkit
简介 正如,pyplot模块被用来绘制二维图,matplotlib使用mplot3d模块绘制三维图形,在mplot3d模块中存在 mpl_toolkits.mplot3d.axes3dmpl_tool ...
- 寒假day01-Spring框架
1.什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE D ...
- ajax使用json数组------前端往后台发送json数组及后台往前端发送json数组
1.引子 Json是跨语言数据交流的中间语言,它以键/值对的方式表示数据,这种简单明了的数据类型能被大部分编程语言理解.它也因此是前后端数据交流的主要方式和基础. 2.前端往后台传输json数据 第一 ...
- let和var的区别
在JavaScript中,定义变量的关键词一般用var,但还有一种定义变量的关键词叫let.两者的作用域范围不一样,我们可以将var理解为定义的是一个全局变量,而let定义的是一个局部变量.故let常 ...
- python内置模块——time
python中常见处理时间的函数除了之前介绍的datetime模块,还有一个time模块,其中最著名的一个方法就是sleep,其在线程.进程中常常得到应用. time模块中表示时间的方式一般有以下四种 ...
- 如何优雅的设计APP页面?
页面框架设计只是整个产品设计中的一环,不要把眼界局限在这一环,也不要只站需求.只站在交互.只站在视觉上思考问题,从多个角度看问题,你才会学会成长. 产品设计是一个系统工程,单独拧出来其中一个流程来讲, ...
- 数字转中文大写=> 1234=> 一千二百三十四
# -*- coding: utf-8 -*- # 最大值:九兆九千九百九十九亿九千九百九十九万九千九百九十九 import re p = ['', '十', '百', '千', '万', '十', ...
- ubuntu 卸载软件
ubuntu完全卸载一个软件 今天卸载一个软件,老是有配置残留,网上找到了解决方案: 查看已安装的软件: dpkg -l |grep 软件名 找到一大堆相关的包,然后卸载核心的包: sudo ap ...
- [SDOI2019]移动金币(博弈论+阶梯Nim+按位DP)
首先可以把问题转化一下:m堆石子,一共石子数不超过(n-m)颗,每次可以将一堆中一些石子推向前一堆,无法操作则失败,问有多少种方法使得先手必胜? 然后这个显然是个阶梯Nim,然后有这样的结论:奇数层异 ...