Codeforces Round #288 (Div. 2)B(字符串)

题意:交换两个数,使得交换后的数是偶数且尽可能大;

KEY:分情况,1末尾数为偶数,即找到比它小的偶数交换,假如没有比它小的偶数,不用交换。2末尾数是奇数,再分情况,《1》全都是奇数(这个可以在一开始就判断掉),即输出-1,《2》有一个偶数,无论如何谁大谁小都要交换,《3》全部偶数都比奇数大,从n - 2(n是字符串长度)开始找到一个偶数交换即可,《4》如果有一些偶数比末尾数大,有些比它小,即从0开始找到比奇数小的那个偶数交换即可。其实是分类讨论。(有更好的方法欢迎交流)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 5;
char num[maxn];

int main()
{
    int odd = 0, k, m = 0, mi = 0;
    char temp;
    char even[maxn];
    memset(num, 0, sizeof(num));
    memset(even, 0, sizeof(even));
    gets(num);
    k = strlen(num);

    for(int i = 0; i < k; i++){
        if(num[i] % 2 != 0){
            odd++;
        }
        else{
            even[m] = num[i];
            m++;
        }
    }

    if(odd == k)
        printf("-1\n");

    else{
        if(num[k - 1] % 2 == 0 ){
            for(int i = 0; i < k; i++){
                if((num[i] % 2 == 0) && (num[i] < num[k - 1])){
                    temp = num[i];
                    num[i] = num[k - 1];
                    num[k - 1] = temp;
                    break;
                }
            }
        }

        if(num[k - 1] % 2 != 0){
            for(int i = 0; i < m; i++)
                if(even[i] > num[k - 1])
                    mi++;

            if(mi == m){
                for(int i = k - 2; i >= 0; i--){
                    if(num[i] % 2 == 0){
                        temp = num[i];
                        num[i] = num[k - 1];
                        num[k - 1] = temp;
                        break;
                    }
                }
            }

            else{
                for(int i = 0; i < k; i++){
                    if((num[i] % 2 == 0 ) && (num[i] < num[k - 1])){
                        temp = num[i];
                        num[i] = num[k - 1];
                        num[k - 1] = temp;
                        break;
                    }
                }
            }
        }
        printf("%s\n", num);
    }
    return 0;
}

 

posted on 2015-01-28 18:57  夏木微凉  阅读(192)  评论(0编辑  收藏  举报

导航