SWAP
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 74 测试通过 : 27
总提交 : 74 测试通过 : 27
比赛描述
给定一个奇数,现在可以交换任意其中任意两个数字仅一次得到一个偶数,求所能得到的最大的偶数,若构成不了偶数则输出-1
输入
输入只有一行,表示一个数字,数字的位数不超过100
输出
输出所能得到的最大偶数,构成不了则输出-1
样例输入
9871
样例输出
9178
题目来源
Tc
题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2128
题意:给定一个奇数,挑选两个数字交换一次使之成为最大的偶数,不能构成偶数则输出-1。
分析:该题可分析得出结果。事先判断是否存在各个数位是否存在偶数。若不存在偶数,则肯定不能得出偶数,输出-1。由于给定的是奇数,尾数肯定是奇数,在确定可交换构成偶数的情况下,我们需要判断尾数该和哪一个偶数交换使得所得结果最大呢?首先要让一个数大就需要让高位的数比较大,所以这里引入尾数和偶数的比较。从高位至低位遍历,找出第一个小于尾数的偶数交换即可,这样既保证数的增大又保证高位尽可能地变高。若所有的偶数都大于尾数,那么任何偶数与尾数交换都会导致原数减小,此时让尾数和自低位向高位的第一个偶数交换,使得减小最小,即可求得最大偶数。
见AC代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=105;
char a[maxn],m[maxn];
int main()
{
while(~scanf("%s",a))
{
int flag=0;
int len=strlen(a);
for(int i=0; i<len; i++)
if((a[i]-'0')%2==0)
{
flag=1;
break;
}
if(!flag)
{
printf("-1\n");
continue;
}
//末尾给定的是奇数
//从数首开始找偶数 找到第一个小于它的交换
//如果所有偶数都比它大 则换最后一个偶数
int num=0;
for(int i=0; i<len-1; i++)
{
if((a[i]-'0')%2==0&&a[i]<a[len-1])
num++;
} //遍历查找有多少个大于尾数的偶数
if(num==0)//所有偶数都比尾数大 则选取最后一个偶数与之交换
{
for(int j=len-2; j>=0; j--)
if((a[j]-'0')%2==0)
{
swap(a[j],a[len-1]);
break;
}
}
else //从首至尾 选取第一个比尾数小的偶数互换
{
for(int i=0; i<len-1; i++)
if((a[i]-'0')%2==0&&a[i]<a[len-1])
{
swap(a[i],a[len-1]);
break;
}
}
for(int i=0; i<len; i++)
printf("%c",a[i]);
printf("\n");
}
}
总结:分析很重要!唯有多刷题锻炼思维。
特记下,以备后日回顾。