1015: 无聊的Light Light
Time Limit: 1 Sec Memory Limit: 128 MB[ Submit][ Status][ Web Board]
Description
ACM实验室某位比较胖的同学在上算法课的时候实在太无聊了,因为他觉得老师讲的实在太简单了。 于是他脑洞大开,拿出了一张白纸,想在纸上写下一个尽量大的正整数。已知这个数每一位上为数字1~9,以及他拥有的初始体力值为w,写下数字i (1 ≤ i ≤ 9)所消耗的体力值ai。 由于这人比较懒,他希望在不超过初始体力值的情况下,他能写出的整数尽量大。
Input
多组数据(不超过100组),处理到EOF。 每组数据包含两行,第一行为w(1 ≤ w ≤ 105)。 第二行为9个整数,分别为a1~a9(1 ≤ ai ≤ 105)。
Output
所求的最大的整数,如果什么都写不了,输出-1。
Sample Input
3
1 1 1 1 1 1 1 1 1
2
3 3 3 3 3 3 3 3 3
4
1 2 3 4 5 6 7 8 9
Sample Output
999
-1
1111
很简单的贪心,首先要保证该数取最长的位数,在此基础上保证从最高位到最低位每一位最大即可。
#include <cstdio>
#include <algorithm>
using namespace std;
int w,mn,all,t,num,a[10];
int sear() {
for(num=9;num;--num)
if(t>=a[num])
return num;
return 0;
}
int main() {
while(scanf("%d",&w)==1) {
mn=100005;
for(num=1;num<=9;++num) {
scanf("%d",a+num);
mn=min(mn,a[num]);
}
if(mn>w)
printf("-1\n");
else {
all=w%mn;//all表示在保证数字位数最多的情况下还剩余多少体力值
while(w>=mn) {
t=all+mn;
printf("%d",sear());//输出满足a[num]<t的最大的num
all-=a[num]-mn;
w-=a[num];
}
printf("\n");
}
}
return 0;
}