zoukankan      html  css  js  c++  java
  • 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
    ");
    
        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
    ", num);
        }
        return 0;
    }
  • 相关阅读:
    天使投资家李镇樟:如何培养世界级企业家
    [案例分析] 打造值得信任的个人品牌究竟靠什么?
    怎能相逢
    企业的创新和创新的双面性
    给创业者的忠告:中国互联网的柏金森定律
    梦想的婚礼
    企业人,需守候精神商业的价值
    我与东方
    五种成功创业模式让你轻松赚到钱
    一招一式, 成就“霸业”必做的9件大事
  • 原文地址:https://www.cnblogs.com/Joe962850924/p/4256742.html
Copyright © 2011-2022 走看看