牛客练习赛20 F-填数字
链接:https://www.nowcoder.com/acm/contest/128/F
来源:牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
托米发现了一种新的游戏--填数字!
每填写一次数字(1≤ i≤9)需要花费ai枚金币,托米总共有n枚金币.
每填写一次数字(1≤ i≤9)需要花费ai枚金币,托米总共有n枚金币.
托米想知道他能得到的最大数字是多少.
如果填不了请输出-1。
不需要用完所有金币
输入描述:
第一行一个数字n,表示金币总数. 第二行9个正整数,第i个数字表示填写一次数字i所需要的金币数.
输出描述:
输出满足条件的最大数字.
备注:
0≤ n≤ 106 1≤ ai≤ 105
先把花费金币多少排序,看最多能组成多少位,最后从最高位开始从9到这个数看如果有大于该数并且花费够就换掉这个数字,直到钱变成0或者不能再换为止。
#include<stdio.h>
#include<string.h>
#define N 1010100
int ans[N];
struct dete{
int v;
int t;
}a[10],b,c[10];
int main()
{
int sum,i,s,j,temp;
while(scanf("%d",&sum)!=EOF)
{
s=0;
for(i=1;i<10;i++) //输入每个数字需要的金币
{
scanf("%d",&c[i].v);
c[i].t=i;
a[i].v=c[i].v;
a[i].t=c[i].t;
}
for(i=1;i<10;i++) //排序
{
for(j=1;j<10-1;j++)
{
if(a[j].v>a[j+1].v)
{
b=a[j];
a[j]=a[j+1];
a[j+1]=b;
}
else if(a[j].v==a[j+1].v&&a[j].t<a[j+1].t) //当花费相同时比较数字的大小
{
b=a[j];
a[j]=a[j+1];
a[j+1]=b;
}
}
}
s = sum/a[1].v; //算出位数
sum = sum%a[1].v; //算出还剩多少金币
for(i=0;i<s;i++) //置换每一位数字
ans[i]=a[1].t;
temp=0;
for(i=0;i<s;i++) //考怒每一位数字
{
if(sum==0)
break;
temp=0;
for(j=9;j>=1;j--) //数字从大到小考虑
{
if(sum+a[1].v>=c[j].v&&ans[i]<c[j].t) //如果花费够而且当前数字大于数组中的数字
{
temp=1;
sum=sum+a[1].v-c[j].v;
ans[i]=c[j].t; //置换当前数字
break;
}
}
if(temp==0)
break;
}
if(s==0) //如果不能组成数字
printf("-1");
else
for(i=0;i<s;i++) //输出数字
printf("%d",ans[i]);
printf("\n");
}
return 0;
}