zoukankan      html  css  js  c++  java
  • PAT Basic 1023 组个最⼩数 (20) [贪⼼算法]

    题目

    给定数字0-9各若⼲个。你可以以任意顺序排列这些数字,但必须全部使⽤。⽬标是使得最后得到的数尽可能⼩(注意0不能做⾸位)。例如:给定两个0,两个1,三个5,⼀个8,我们得到的最⼩的数就是10015558。现给定数字,请编写程序输出能够组成的最⼩的数。
    输⼊格式:
    每个输⼊包含1个测试⽤例。每个测试⽤例在⼀⾏中给出10个⾮负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间⽤⼀个空格分隔。10个数字的总个数不超过50,且⾄少拥有1个⾮0的数字。
    输出格式:
    在⼀⾏中输出能够组成的最⼩的数。
    输⼊样例:
    2 2 0 0 0 3 0 0 1 0
    输出样例:
    10015558

    题目分析

    已知0-9数字的个数,至少有一个非0数,求最小组合数,首位不可以是0

    解题思路

    1. 贪心思想:依次取当前最小的数字作为高位
    2. 输入时用变量k,记录最小非0数字作为首位
    3. 打印首位数字k,并ts[k]--(k次数--)
    4. 遍历数组,依次取当前最小数字作为高位

    注意点

    因为题目已知最少有一个非0数,所以全0的情况不需要特殊考虑

    Code

    Code 01

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main(int argc, char * argv[]) {
    	int k=0,ts[10]= {0};
    	for(int i=0; i<10; i++) {
    		scanf("%d",&ts[i]);
    		if(ts[i]>0&&i!=0&&k==0)k=i;
    	}
    	printf("%d",k);
    	ts[k]--;
    	for(int i=0; i<10; i++) {
    		for(int j=0; j<ts[i]; j++)printf("%d",i);
    	}
    	return 0;
    }
    
  • 相关阅读:
    日报9.4
    日报9.3
    低级错误整理
    树状数组求逆序对 笔记与思路整理
    st表、树状数组与线段树 笔记与思路整理
    Luogu P1098 字符串的展开
    Luogu P1816 忠诚
    jmeter cookie管理器 使用方法---新手学习记录1
    kali nessus 安装插件失败解决方法
    https tomcat 证书搭建
  • 原文地址:https://www.cnblogs.com/houzm/p/12245575.html
Copyright © 2011-2022 走看看