蘑菇街春招Android岗编程题(一)

题目描述:
爱情数字
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Problem Description:
小峰疯狂的爱上了小兰,他想要向小兰告白,小峰是个内向的男孩子,不好意思当面说,正好小兰家的对面是一个很大的广告牌,
所以他想要借助广告牌说出自己的爱情宣言。小峰想要在广告牌上写数字表达自己对小兰的爱意,数字越大代表队小兰的爱意越深,
越容易获得小兰的垂青。不幸的是小峰只有v升油漆来书写数字,而数字d需要ad升油漆才能写好,并且小峰知道小兰不喜欢数字0,
所以他不会让0出现在自己的爱情数字当中。请帮助小峰找到他利用手里的油漆能够完成的最大数字。
输入
第一行数据是一个整数:v (0≤v≤106),表示拥有的总油漆数量。
第二行数据是九个整数:a1,a2, …,a9 (1≤ai≤105),表示数字1~9 分别需要的油漆数量。
输出
输出能够完成的最大数字,如果一个数字也完成不了输出-1
样例输入

5
5 4 3 2 1 2 3 4 5

样例输出

55555

算法思路:用贪心法则找出数字最大并且用油漆数量最少的数字,计算出可以画此数(min)的个数以及余数(剩余油漆数量),判断余数加上油漆数量是否可以“兑换”一个最大的数字,如果有,兑换此数,min的数量减1,重新计算出此时剩余的油漆数量,重复次步骤,循环结束条件是余数不大于0,或者没有数字可以满足兑换条件。

代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void MaxLoveNum(int data[],int v)
{
    int i,k;              //k用来保存所需油漆数量最少且数字最大的数的位置
    int min=data[0];
    string result;
    for(i=0;i<9;i++)
    {
        if(min>=data[i])
        {
            min=data[i];
            k=i;
        }
    }
    if(min>v)
    {
        cout<<-1<<endl;
        return;
    }
    int mod=v%min;       //余数
    int numofk=v/min;           //刷出此数的个数

    while(mod>0)
    {
        int flag=0;
        for(i=8;i>k;i--)
            if(data[k]+mod>=data[i])
            {
                flag=1;
                mod+=data[k]-data[i];
                result+=i+1+'0';
                numofk--;
                break;
            }

         if(!flag)
            break;
    }

    for(i=0;i<numofk;i++)
    {
        result+=k+1+'0';
    }

    cout<<result<<endl;

}


int main()
{
    int v,a[9];
    while(cin>>v)
    {
        for(int i=0;i<9;i++)
            cin>>a[i];
        MaxLoveNum(a,v);
    }
    return 0;
}

总结:貌似是一道ACM试题,好后悔本科没有去ACM (┬_┬)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值