首页 > 试题广场 >

最小和

[编程题]最小和
  • 热度指数:217 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

现在有n个0到9的数字,需要用它们组成两个数,这两个数都不能有前导0,使得这两个数加起来最小。


输入描述:
第一行一个整数n,表示数字的个数。
第二行n个0-9的数字。


输出描述:
输出得到的最小和。
示例1

输入

4
3 0 2 1

输出

33

说明

样例中:10+23=33

备注:

数据保证至少有两个非0数字。
#include <bits/stdc++.h>

using namespace std;

int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int n, a[20], x = 0, y = 0, num = 0, cc = 0;
	cin >> n;
	while (cin >> a[cc++])
        num++;//补全输入
    if (num < n)
    {
        for (int i = num; i < n; i++)
        {
            a[i] = a[num-1];
        }
    }
	sort (a, a + n); 
	for (int i = 0; i < n; i++)
	{
		if (a[i] != 0)
		{
			x = a[i];
			y = a[i + 1];
			swap (a[0], a[i]);
			swap (a[1], a[i + 1]);//交换
			break;
		}
		else
			continue;
	}
	sort (a + 2, a + n);
	for (int i = 1; i < n; i++)
	{
		if (i % 2 == 0)
			x = x * 10 + a[i];
	}
	for (int i = 2; i < n; i++)
	{
		if (i % 2 != 0)
			y = y * 10 + a[i]; 
	}
	cout << x + y;
	return 0;
}


发表于 2020-03-22 10:12:19 回复(1)
def adaptlist(B):
    # 将一个列表中的零元素和非零元素分开
    # c中存储的是零元素,d中存储的是非零元素
    c = list()
    d = list()
    for b in B:
        if b == 0:
            c.append(b)
        else:
            d.append(b)
    return (c, d)

# 数据的输入及相关处理


def getnumber(d):
    # 将选取的两个数分别存入num1,num2中
    num1 = list()
    num2 = list()
    for i in range(0, len(d)):
        if i % 2 == 0:
            num1.append(d[i])
        else:
            num2.append(d[i])
    return (num1, num2)


def list2number(num):
    # 将list中的元素变成一个数
    a = 0
    for i in range(0, len(num)):
        a = a + num[i] * 10**(len(num) - i - 1)
    return a


# 标准输入
import sys
# 这里考虑一行数据里有多个数据,所以我们用二维list来进行存储
num = [[0 for col in range(0)] for row in range(2)]
s = sys.stdin.readline().strip()  # 得到第一行的数据
for i in range(2):
    temp = s.split()  # 删掉字符串的首尾空格
    num[i] = list(range(len(temp)))
    for kk in range(len(temp)):
        num[i][kk] = int(temp[kk])
    s = sys.stdin.readline().strip()


# 数据的处理
# 将输入的一些数据组成两个数,使得这两个数加起来最小
# 显然位数越小和最小,比如8个数组成两个四位数和最小,7个数组成4位数加3位数和最小
# 将除零以外的最小的两个数做为这两个数的首位,其余的数按从小到大的数排列
# 首先将输入的数据在list中从小到大进行排列,并保证第一个数不是0
# 在这里调用sort函数(也可以用sorted函数,这里就不再赘述)
# b = list(map(int, b))


b = num[1]  # 得到输入的数
# 判断输入的数字是否需要补齐
k = b[-1]
m = num[0][0] - len(b)
if m != 0:
    for i in range(0, m):
        b.append(k)
c, d = adaptlist(b)
# 确定组成的两个数位数分别是多少
d.sort()  # 将所有非零元素按从小到大的顺序排列

if c != []:
    for x in c:
        d.insert(2, x)
num1, num2 = getnumber(d)
a = list2number(num1)
b = list2number(num2)
print(a + b)

发表于 2019-04-26 21:22:06 回复(0)

import java.lang.reflect.Array;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Scanner;


public class aaa {

    

    public static void main(String[] args) {

   Scanner in = new Scanner(System.in);

   System.out.println("请输入一串数,数串长度在2-16之间");

   //接收字符串型数字串

   String str = in.nextLine();

   //分割为字符数组

   String[] str1 =str.split("");

   //转换为数字数组

   int[] b = new int[str1.length];

   for(int i=0;i<str.length();i++) {

       b[i]=Integer.parseInt(str1[i]);

   }

   //对数组进行排序

   Arrays.sort(b);

   //找0的个数

   int j = 0;

   for(int i = 0;i<b.length;i++) {

       if(b[i]==0) 

           j++;

       if(b[i]!=0)

        break;

   }     

   int number1=0;

   int number2=0;

   int sum;

   

   if(j>=2) {

       //0大于两个,取最小的两个不为0的数乘10并相加

       number1 = b[j]*10;

       number2 = b[j+1]*10;

   }else{

       if(j==1) {

           //交换b[0]与b[1],得到值为X0YZ数组

           int c;

           c =b[1];

           b[1]=b[0];

           b[0]=c;

                   

       }

       //求和X0+YZ

       number1 = b[0]*10+b[1];

       number2 = b[2]*10+b[3];  

   }

   sum = number1 + number2;

   System.out.println(sum);

   

   }

}

发表于 2019-04-18 19:57:25 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int a[100];
int main()
{
    int n =0;
    int tn = 0;
    cin>>n;
    //题目的问题,第二行输入如果不足n个数用最后一个数补齐
    while(cin>>a[tn++])
    for(int j=tn;j<n;j++)
        a[j]=a[tn-1];
       sort(a,a+n);
    int sum1 = 0;
    int sum2 = 0;
    //前两个数如果是0和后面第一个非0交换
    for(int j=0;j<2;j++)
        if(!a[j])
            for(int i=1;i<n;i++)
                if(a[i])
                {
                    swap(a[i],a[j]);
                    break;
                }
    //奇偶交错输出
    for(int i = 0;i<n;i+=2)
        sum1=sum1*10+a[i];
    for(int i = 1;i<n;i+=2)
        sum2=sum2*10+a[i];
    cout<<sum1+sum2<<endl;
    return 0;
}

发表于 2019-04-18 16:00:16 回复(0)
排序,奇数位给数1,偶数位给数2,求和。
题中没说明白一点:(第二行输入不够n个时,用最后输入的数补齐n个)
代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int n_numbers;
    cin >> n_numbers;
    vector<int> vi;
    
    int tmp, in_count=0;
    while (cin >> tmp )
    {
        //cout << "tmp is:" << tmp << endl;
        vi.push_back(tmp);
        in_count++;
    }
    //vi.resize(n_numbers);
    while (in_count < n_numbers)
    {
        ++in_count;
        vi.push_back(tmp);
    }

    // print vi
    //cout << "input " << n_numbers << " number:" << endl;
    //for (auto index = vi.begin(); index != vi.end(); ++index)
    //{
    //    cout << *index << " ";
    //}
    //cout << endl;

    sort(vi.begin(), vi.end());
    auto i_not0 = vi.begin();
    int count = 0;
    while (*i_not0 == 0)
    {
        ++i_not0;
        ++count;
    }
    if (count >= 2)
    {
        // swap 0 -- inot
        *vi.begin() = *i_not0;
        *i_not0 = 0;
        // swap 1 -- next of inot
        *(++vi.begin()) = *(++i_not0);
        *i_not0 = 0;
    }
    if (count == 1) // so,i_not0 == 1
    {
        // swap 0--1
        *vi.begin() = *i_not0;
        // swap 1--2
        auto next = i_not0 + 1;
        *i_not0 = *next;
        *next = 0;
    }

    //cout << "after sorted " << n_numbers << " number:" << endl;
    //for (auto index = vi.begin(); index != vi.end(); ++index)
    //{
    //    cout << *index << " ";
    //}
    //cout << endl;

    int num1 = 0;
    int num2 = 0;
    bool flag = true;
    for (auto index = vi.begin(); index != vi.end(); ++index)
    {
        if (flag == true)
            num1 = num1 * 10 + *index;
        else
            num2 = num2 * 10 + *index;
        flag = !flag;
    }
    //cout << "num1:" << num1 << ",num2:" << num2 << endl;
    cout << num1 + num2;
    return 0;
}


发表于 2019-04-18 15:33:41 回复(0)
这种题不是数字排序取前面小的四个么?
发表于 2019-04-17 00:50:42 回复(0)