Color the fence
- 描述
-
Tom has fallen in love with Mary. Now Tom wants to show his love and write a number on the fence opposite to
Mary’s house. Tom thinks that the larger the numbers is, the more chance to win Mary’s heart he has.
Unfortunately, Tom could only get V liters paint. He did the math and concluded that digit i requires ai liters paint.
Besides,Tom heard that Mary doesn’t like zero.That’s why Tom won’t use them in his number.
Help Tom find the maximum number he can write on the fence.
- 输入
- There are multiple test cases.
Each case the first line contains a nonnegative integer V(0≤V≤10^6).
The second line contains nine positive integers a1,a2,……,a9(1≤ai≤10^5). - 输出
- Printf the maximum number Tom can write on the fence. If he has too little paint for any digit, print -1.
- 样例输入
-
5 5 4 3 2 1 2 3 4 5 2 9 11 1 12 5 8 9 10 6
- 样例输出
-
55555 33
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,t;
int a[10009];
int n;
int min;
while(~scanf("%d",&n))
{
min=0x3f3f3f3f; //最大值
for(i=0;i<9;i++)
{
scanf("%d",&a[i]);
if(min>=a[i])
min=a[i];
}
if(n<min)
{
printf("-1\n");//判断,如果不要符合条件的话直接退出
continue;
}
for(i=n/min;i>=0;i--)
{
for(j=8;j>=0;j--)
{
if(n>=a[j]&&(n-a[j])/min>=i)
{
n-=a[j];
printf("%d",j+1);
break;
}
}
}
printf("\n");
}
return 0;
}分析:
涂料一定, 肯定涂出的数字越多,数字就越大。所以我们就可以在涂出数字最多的情况下,枚举每一位的可以数字取最大(从9开始枚举找打第一个符合既是答案)。
枚举的符合条件就是当前的涂料可以涂此数字并且涂完此数字不影响涂的总数字的个数(即涂的总数字的个数不会减小)。
scanf()函数返回成功赋值的数据项数,出错时则返回EOF(-1)
也就是说scanf返回值的取值范围是大于等于-1的整数
只有返回值为EOF时 其取反的的值 即while循环的判断条件才为0 才能结束循环
其它输入情况下(无论是否输入成功) while循环的判断条件为非0 即为真
楼主给出的程序是很不严谨的 一但输入的值为字母符号之类的
scanf赋值不成功把读到的内容又返回到stdin的缓冲区
假设这个被吐回的值为t
由于scanf返回的值不是EOF而是其它非负整数
其取反得到的值使while又进入到下一次循环
scanf又从stdin缓冲区里读到了原先吐回的t
往返如此成了死循环……
楼主的代码要想执行成功只有这样操作
输入个int类型的值后再回车
接着可多次如上操作 想结束输入时
再人为制造个EOF(ctrl+z/d)
再回车使while循环条件为假结束循环
这时n的取值为最后一次成功读取到的int型数值