2021年11月14日

这篇博客介绍了一道NOIP1998年的编程题——拼数,通过贪心算法来找到一组正整数连接成的最大多位整数。作者首先解释了贪心算法的基本思想,即每次选择局部最优解,然后展示了如何通过比较相邻数字并交换位置来实现这一策略。代码中使用了C++,重点在于字符串操作,通过比较字符串拼接结果来确定最佳排列。
摘要由CSDN通过智能技术生成

[NOIP1998]拼数

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

设有n个正整数(n ≤ 20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613

输入描述:

第一行,一个正整数n。
第二行,n个正整数。

输出描述:

一个正整数,表示最大的整数

示例1

输入

3
13 312 343

输出

34331213

嗯。。。这是我写的第一道贪心算法题。贪心算法就是只考虑目前情况的最优解,而不考虑其他的。这里面有一个排序的问题。就是说按什么来排,先不考虑这个问题。假设所有的数字已经被排成了一列,现在只看两个相邻的数字,显然地其他数字不受影响,那么目前只要这两个数字组合起来最大就好了,放到整体上来说就是只要每两个数字的组合都是最大的,那么整个排列就会达到最大。好了,下面我们来写一下代码。。对了,这个写法里面用了一个string的写法,这个它里面两个数组元素相加不是按一般的相加。。比如说1+2它是等于12的。。

代码

#include <cstdio>
#include <bits/stdc++.h>
using namespace std;
//今天·我有点弄不明白一个String类型相加是咋搞的
// 下面写一个来看一看
/*int main()
{
    string num[5];
    for(int i=0;i<5;i++)
    {
        cin>>num[i];
    }
    cout<<num[1]+num[2];
    return 0;
}//这把懂了,就是按位数来就行*/
int main()
{
    int n;
    cin>>n;
    string num[n];
    for(int i=0;i<n;i++)
    {
        cin>>num[i];
    }
    for(int i=0;i<n-1;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            if(num[i]+num[j]<num[j]+num[i])
                swap(num[i],num[j]);
        }//找出最合适的排列
    }
    for(int i=0;i<n;i++)
    {
        cout<<num[i];
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值