zoukankan      html  css  js  c++  java
  • 牛客练习赛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)需要花费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
    
    先把花费金币多少排序,看最多能组成多少位,最后从最高位开始从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("
    ");
    	}
    	return 0;
    }
    

  • 相关阅读:
    android自定义通知栏遇到的问题
    写博客号的初衷
    模型转换遇关键字
    界面传值的四种方式
    button循环添加事件
    解析数据的步骤
    数组排序 (数组是有序容器,因此集合中只有数组才能排序。)
    集合遍历
    自定义view和自定义cell
    cell自适应高度
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10003034.html
Copyright © 2011-2022 走看看