牛客练习赛20 F-填数字

链接: https://www.nowcoder.com/acm/contest/128/F
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

托米发现了一种新的游戏--填数字!
每填写一次数字(1≤ i≤9)需要花费a i枚金币,托米总共有n枚金币.
托米想知道他能得到的最大数字是多少.
如果填不了请输出-1。
不需要用完所有金币

输入描述:

第一行一个数字n,表示金币总数.
第二行9个正整数,第i个数字表示填写一次数字i所需要的金币数.

输出描述:

输出满足条件的最大数字.
示例1

输入

复制
5
5 4 3 2 1 2 3 4 5

输出

复制
55555
示例2

输入

复制
2
9 11 1 12 5 8 9 10 6

输出

复制
33
示例3

输入

复制
0
1 1 1 1 1 1 1 1 1

输出

复制
-1

备注:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41505957/article/details/80710249