题目链接:http://codeforces.com/contest/349/problem/B
题目大意:有v升油漆想要涂出一个数字,给出数字1-9所需油漆,求用v升油漆可涂的最大数字
此题为贪心,基本思路为:找出所需油漆最小的数字(所需油漆相同取较大数字)d,所需油漆为min_v,v/min_v为数字的最大位数(max_bit),到这告一段落,假想求出的最大数就为max_bit个d组成,如输入:5 5 4 3 2 1 2 3 4 5能知道输出为:5个5——>55555。现在看另一个例子:5 2 2 4 5 4 5 4 3 5若果按刚才的想法输出为:2个2——>22但是事实为:82,接下来思考,在保证位数最大时,怎么得到最大值。要想数字大,那么首位尽可能大(首先考虑完位数问题了),如果v整除了min_v就没有改动的余地了,如果有余数leave,那么这个最大数还有改动的空间,从最大位开始贪心,能把最高位改动(前提可改的数大于d)就变动。变动后输出可改数值,最大位数max_bit-1;
代码:
#include<stdio.h>
int main(){
int v,a[11],d,min_v,max_bit,leave;
while(~scanf("%d%d",&v,&a[1])){
min_v=a[1];d=1;
for(int i=2;i<10;i++) //找出升数最小数值;
{
scanf("%d",&a[i]);
if(a[i]<=min_v){
min_v=a[i];
d=i;
}
}
if(min_v>v){ //若最小值大于v,无解,输出-1;
printf("-1
");
continue;
}
max_bit=v/min_v; //求最大位数;
leave=v%min_v; //求出在位数最大的前提下,最大余数;
for(int i;leave>0&&max_bit;){ //贪心;使高位数字尽可能大;确保最大位数非负;
for(i=9;i>d&&max_bit;i--){
if(leave>=(a[i]-a[d])){
printf("%d",i);
max_bit=max_bit-1; //输出数字后,最大位数-1;
leave-=(a[i]-a[d]);
break;
}
}
if(i==d) break;
}
for(int i=0;i<max_bit;i++) printf("%d",d); //输出剩下的位数;
printf("
");
}
return 0;
}