1023 组个最小数(附详细注释,逻辑分析)

写在前面

  • 实现思路
    • 整型数组存储数字出现次数,顺序表示我们拥有数字 0、数字 1、……数字 9 的个数
    • 找出非0的第一个数字,次数减1
    • 循环输出剩余数字
    • 逻辑思想再次学习!
  • 题目较简单,15分钟a题

测试用例

input:
2 2 0 0 0 3 0 0 1 0

output:
10015558

ac代码

#include 
using namespace std;

int main()
{
    int counts[10];
    for(int i=0; i<10; i++) scanf("%d", &counts[i]);
    for(int i=1; i<10; i++)
    {
        if(counts[i]>0)
        {
            printf("%d", i);
            counts[i]--;
            break;
        }
    }
    for(int i=0; i<10; i++)
        for(int j=0; j<counts[i]; j++)
            printf("%d", i);

    return 0;
}
  • 个人实验(强制使用next_permutation
    • 求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件
    • 运行超时,16分
#include 
#include
using namespace std;

int main()
{
    int num, digits[60], cnt=0;
    for(int i=0; i<10; i++)
    {
        scanf("%d", &num);
        for(int j=0; j<num; j++) digits[cnt++] = i;
    }
    string result, tp_str;
    result.append(cnt, '9');

    do
    {
        if((digits[0]==0) || (digits[0]>(result[0]-'0'))) continue;
        for(int k=0; k<cnt; k++) tp_str += digits[k]+'0';
        if(result.compare(tp_str)>0)
            result=tp_str;
        tp_str = "";
    }
    while(next_permutation(digits,digits+cnt));
    cout << result;

    return 0;
}

学习代码

  • 1023. 组个最小数 (20).cpp
    • 实现思想
      • 一层循环找出最小值,输出、跳出循环
      • 循环打印0的个数
      • 循环打印次小数字
      • 循环打印次小下标后的数字
#include 
using namespace std;
int main() {
    int a[10], t;
    for (int i = 0; i < 10; i++)
        cin >> a[i];
    for (int i = 1; i < 10; i++) {
        if (a[i] != 0) {
            cout << i;
            t = i;
            break;
        }
    }
    for (int i = 0; i < a[0]; i++) cout << 0;
    for (int i = 0; i < a[t] - 1; i++) cout << t;
    for (int i = t + 1; i < 10; i++)
        for (int k = 0; k < a[i]; k++)
            cout << i;
    return 0;
}

你可能感兴趣的:(PAT(乙级),算法比赛相关,1023,组个最小数)