牛客练习赛20 F-填数字

本文介绍了一款填数字游戏的算法实现,玩家需花费不同数量的金币来填充数字,目标是在限定金币内得到最大可能的数字组合。文章详细阐述了算法步骤,包括金币花费排序、确定最大数字位数及逐位优化等过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接: 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张宜强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值