Color the Fence------贪心

Igor爱上Tanya,想要用油漆在她家对面的围栏上写下数字来表达爱意。面对有限的油漆和不同数字的消耗量,如何找出最大可能的数字成为了一道有趣的数学挑战。

Igor has fallen in love with Tanya. Now Igor wants to show his feelings and write a number on the fence opposite to Tanya’s house. Igor thinks that the larger the number is, the more chance to win Tanya’s heart he has.

Unfortunately, Igor could only get v liters of paint. He did the math and concluded that digit d requires ad liters of paint. Besides, Igor heard that Tanya doesn’t like zeroes. That’s why Igor won’t use them in his number.

Help Igor find the maximum number he can write on the fence.

Input
The first line contains a positive integer v (0 ≤ v ≤ 106). The second line contains nine positive integers a1, a2, …, a9 (1 ≤ ai ≤ 105).

Output
Print the maximum number Igor can write on the fence. If he has too little paint for any digit (so, he cannot write anything), print -1.

Examples
Input
5
5 4 3 2 1 2 3 4 5
Output
55555

Input
2
9 11 1 12 5 8 9 10 6
Output
33

Input
0
1 1 1 1 1 1 1 1 1
Output
-1

题意

有v升油漆,给出涂写数字1-9分别所需的油漆,求能写的最大数字

解题思路

读题好费劲,读了好几遍才懂,分析了一下样例发现都是使用油漆最少的数,很显然找使用油漆最小的数n能得到最大位数max,那得到的这个数就是最大的,直接输出max次n,交了一发之后wa了,又想了一下发现有特殊情况没考虑到,就是油漆不能整除所找的最小数时,也就是说油漆还有剩的,这时候的高位上的数有可能可以大于n;那就在n~9之间寻找符合的数。
代码实现

#include<iostream>
using namespace std;
int main()
{
	int v;
	int a[10];
	int min = 1000000;
	int t;
	cin >> v;
	for (int i = 1; i <= 9; i++)//最小数值
	{
		cin >> a[i];
		if (a[i] <= min)
		{
			min = a[i];
			t=i;
		}
	}
	if (v < min)//最小值大于v,无解
	{
		cout << "-1" << endl;
		return 0;
	}
	int max, k;
	max = v / min;  //最大位数
	k = v % min;//余数
	for (int i; k > 0 && max;) //使高位尽量大
	{   
		for (i = 9; i > t&& max; i--) 
		{
			if (k >= (a[i] - a[t])) 
			{
				cout<< i;
				max = max - 1;  
				k -= (a[i] - a[t]);
				break;
			}
		}
		if (i == t) break;
	}
	for (int i = 0; i < max; i++) 
		cout << t;
	return 0;
}
请使用c++14,运用反悔贪心解决: ## 题目描述 南极南部大学的企鹅学系正在进行企鹅种群的研究工作。研究人员将密集站立的企鹅群体进行拍照,随后由学生对这些照片进行处理。企鹅的识别方式如下:在照片上选取一条特征条带,该条带的高度为 1 个像素,并且条带上的每个像素都属于某一只企鹅的图像。 研究中的企鹅都有相似的体色特征:腹部为白色,背部和翅膀为黑色。因此: - 若照片上只看到企鹅的背部,则对应的条带上会出现一段连续的黑色像素; - 若只看到腹部,则为连续的白色像素; - 若既能看到翅膀又能看到腹部(例如翅膀遮在白色腹部前),则该企鹅对应的条带上会出现由黑白混合组成的像素段。 为了便于后续研究,需要保证每只企鹅在特征条带上都对应一个**仅由黑色或仅由白色像素组成的连续段**。 对于第 $i$ 张照片,已知其特征条带上可能出现的企鹅数量不超过 $k_i$。因此,必须将该条带替换为一条长度相同的**简化条带**,它由不超过 $k_i$ 个连续的色段组成,每个色段要么全为黑色,要么全为白色。在所有可能的简化条带中,需要选择一种**最优方案**,即通过**最少次数地修改像素颜色**,使原条带转化为合法的简化条带。 请编写程序完成上述任务。 ## 输入格式 输入的第一行包含整数 $t$ —— 照片的数量。接下来有 $t$ 组数据,每组对应一张照片。 每组数据的第一行包含两个整数: - $n_i$ —— 第 $i$ 张照片的特征条带长度; - $k_i$ —— 该条带上最多可能出现的企鹅数量(保证 $k_i \le n_i$)。 第二行包含一个长度为 $n_i$ 的字符串,由字符 **0** 和 **1** 组成。**0** 表示黑色像素;**1** 表示白色像素。 ## 输出格式 输出 $t$ 行。第 $i$ 行应为一个长度为 $n_i$ 的字符串,由字符 **0** 和 **1** 组成,表示通过最少修改后得到的第 $i$ 张照片的**简化条带**。如果存在多个最优答案,输出任意一个即可。 ## 输入输出样例 #1 ### 输入 #1 ``` 3 9 3 000111000 10 3 0111011010 4 4 0001 ``` ### 输出 #1 ``` 000111000 0111111000 0001 ``` ## 说明/提示 ### 数据范围 | 子任务编号 | 分值 | $n_i, k_i$ 的范围 | $n = n_1 + n_2 + \cdots + n_t$ 的范围 | |:--:|:--:|:--:|:--:| | 1 | 11 | $1 \le k_i \le n_i \le 10$ | $1 \le n \le 5000$ | | 2 | 24 | $1 \le k_i \le n_i \le 100$ | $1 \le n \le 5000$ | | 3 | 24 | $1 \le k_i \le n_i \le 1000$ | $1 \le n \le 50\,000$ | | 4 | 21 | $1 \le k_i \le 5000$ | $1 \le n \le 100\,000$ | | 5 | 20 | $1 \le k_i \le 200\,000$ | $1 \le n \le 200\,000$ |
最新发布
11-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值