首页 > 代码库 > Codeforces Round #288 (Div. 2)B(字符串)
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;}
Codeforces Round #288 (Div. 2)B(字符串)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。