填数字
题目来源,牛客练习赛20 F题
链接:https://www.nowcoder.com/acm/contest/128/F
来源:牛客网
题目描述
托米发现了一种新的游戏–填数字!
每填写一次数字(1≤ i≤9)需要花费ai枚金币,托米总共有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
思路分析
第一反应,排序+遍历,傻瓜做法,结果WA一直45%,后来大佬给了一个案例才知道错了,
10
3 10 10 10 10 10 10 10 4
傻瓜做法答案是111,但是正确答案应该是911,所以正确方法应该是先找到最小金币的数字,然后判断是否可以在他的基础上增大,直接上AC代码。
AC代码
#include<iostream>
using namespace std;
int main()
{
int n,que[10],min=999999,f;
cin>>n;
for (int i=1;i<10;i++)
{
cin>>que[i];
if (min>=que[i])
{
min=que[i];
f=i;
}
}
int k=n/min; //k是数字的个数
n-=k*min; //n是剩余金币数
if (k==0)
cout<<"-1";
else
{
for (int i=9;i>f;i--)
{
while ((n+min)>=que[i])
{
cout<<i;
k--; //减去一个数字f
n-=que[i]-min; //增加一个数字i
}
}
for (int i=0;i<k;i++)//输出剩下的数字f
cout<<f;
}
}
WA 45%代码
#include<iostream>
#include<algorithm>
using namespace std;
int book[10],f=0;
typedef struct
{
int data;
int flag;
}Node;
int cmp(Node a,Node b)
{
if (a.data!=b.data)
return a.data<b.data;
else
return a.flag>b.flag;
}
int main()
{
int n;
cin>>n;
Node que[10];
for (int i=1;i<10;i++)
{
cin>>que[i].data;
que[i].flag=i;
}
sort(que+1,que+10,cmp);
for (int i=1;i<10;i++)
{
if (n/que[i].data==0)
break;
book[que[i].flag]+=n/que[i].data;
n%=que[i].data;
}
for (int i=9;i>0;i--)
{
for (int j=0;j<book[i];j++)
{
cout<<i;
f=1;
}
}
if (f==0)
cout<<"-1";
}