Color the Fence(Codeforces Round #202 (Div. 2))

题目链接: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;
}
原文地址:https://www.cnblogs.com/shmilky/p/14089015.html