NOJ 2128 SWAP 简单分析

SWAP

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 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");
	}
}
    总结:分析很重要!唯有多刷题锻炼思维。

    特记下,以备后日回顾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值