hdu1106( 排序)

来源:互联网 发布:联想手机截图软件 编辑:程序博客网 时间:2024/05/22 00:23

                                                          排序

                                                Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
                                                             Total Submission(s): 25827    Accepted Submission(s): 7030

Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。 
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
 
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

Sample Input
0051231232050775
 
Sample Output
0 77 12312320
Source
POJ
此题很练习编码能力,好多细节要处理。。

//81108522013-04-17 23:41:57Accepted11060MS320K2047 BC++Achiberx#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;const int maxn = 1010;char str[maxn];int b[maxn];int c[maxn];int index = 0;int cmp_int(const void *a, const void *b) {    return *(int *)a - *(int *)b;}int div1(int from, int to) {    int d = 1;    int sum = 0;    for(int i = from; i <=to; i++) {        sum += d*b[i];        d = d*10;    }    return sum;}void work() {    int k = 0;    int from = 0;    int to = index-1;    for(int i = 0; i <=index-1; i++ ) {        if(b[i]==5 || i==index-1) {           if(b[i]==5) {                if(i!=0) {                   int tmp = div1(from, i-1);                    c[k++] = tmp;                    from = i+1;                }                from = i+1;                continue;           }           else {               int tmp = div1(from, i);               c[k++] = tmp;           }        }    }    qsort(c, k, sizeof(c[0]), cmp_int );    if(k >= 2) {        for(int j = 0; j <= k-2; j++) {            cout << c[j] << ' ';        }        cout << c[k-1];        cout << endl;    }    else {        cout << c[0] << endl;    }}void init() {    while(scanf("%s", str)!= EOF) {        int len = strlen(str);        bool first = true;///代表是第一个出现的5。        index = 0;        for(int i = len-1; i >= 0; i--) {            if(str[i]!='5'){                first = true;                b[index++] = str[i]-'0';                continue;            }            if(str[i]=='5'&&first&&i!=len-1) {///连续的5仅仅存一个,最前,最后都没5.                first = false;                b[index++] = str[i]-'0';                continue;            }            if((str[i]=='5'&&i==len-1)||(!first&&i!=len-1)) {                continue;            }        }        ///finish change;        work();    }}int main(){    init();///先处理一下,去掉重复的5;    return 0;}/****************测试数据:550775599     4050070567      //前导零。445666550051231232050775********************/


原创粉丝点击