OCAC暑期比赛第一场 E题 有用的数学 题解

有用的数学
原题链接:http://codeforces.com/problemset/problem/339/A
不过在原题基础上做了一些强化,以巩固学生对输入的处理能力。
【题目描述】
聪聪是爱丽丝魔法学院的三年级学生。他现在正在学习加法运算。
老师写下了一组加法运算。聪聪需要计算这组运算的结果。
老师给的问题是包含多个整数的加法(这些整数的数据范围在 1 到 1000 之间),并且两个正数之间有一个字符 "+" 。
但是如果公式中存在前一个元素比后一个元素大的情况,聪聪就不会算了。
聪聪能够解决一个加法公式,当且仅当加法运算中的每两个相邻元素都满足“前一个元素不大于后一个元素”的条件。
比如,聪聪能够计算 "1+2+3+4+5" 和 "2+2+3";
但是,聪聪不能够计算 "3+2+5" ,因为在这个公式中 3 和 2 相邻并且 3 在 2 的前面,但是 3 比 2 大。
现在老师已经将加法公式布置下来了,为了能够让聪聪计算出这个问题,请帮忙调换加法中的元素的顺序,使得聪聪可以计算这个公式的和。
【输入格式】
输入一行包含一个非空的字符串 s (s的长度不会超过1000),它用于表示聪聪需要计算的加法公式。
字符串 s 中不包含空格。它仅仅包含若干个整数(每个整数的范围在1到1000之间),每两个相邻证书之间有一个 "+" 号分隔。
【输出格式】
你需要将字符串 s 中包含的每一个元素重新进行排序,并输出排序的结果。
你需要确保结果中的每两个相邻元素之间都满足前一个元素不大于后一个元素,并且两个相邻元素之间有一个 "+" 号分隔。
【样例输入1】
3+2+1
【样例输出1】
1+2+3
【样例输入2】
1+1+3+1+3
【样例输出2】
1+1+1+3+3
【样例输入3】
2
【样例输出3】
2
【问题分析】
首先如何处理输入?
我们可以发现,输入都是一个数字+一个字符。
对于非最后一个元素来说的所有元素,它后面跟的字符都是 "+";
对于最后一个元素来说,它后面跟的字符是 "\n" (也有可能是 EOF)。
所以,我们比较适合与使用 C 语言中的 scanf 函数。
定义一个 int 类型的变量 num ,以及一个 char 类型的变量 c ,以及存放所有元素的数组 a[],
每次 scanf("%d%c", &num, &c) ,将 num 放入数组 a[] 中,并判断 c 是不是 "\n" (或者 EOF),以结束输入。
然后对数组 a[] 进行排序,并输出。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int num, a[110], n;
char c;

int main() {
    while (scanf("%d%c", &num, &c) != EOF) {
        a[n++] = num;
        if (c == '\n' || c == EOF) break;
    }
    sort(a, a+n);
    for (int i = 0; i < n; i ++) {
        if (i) putchar('+');
        printf("%d", a[i]);
    }
    putchar('\n');
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11113429.html