摘要
题意
给一个很长的奇数,交换任意两位,使得其变成尽量大的偶数,问这个偶数是多少。
题解
欸这个……算是贪心吧
- 奇数变偶数肯定要换最后一位,然后判断前面的。
- 尽量比原数大,那就从高位往地位,找第一个比最后一位小的偶数位来交换。
- 如果无法比原数大,那就尽量变得不那么小,那就从低位往高位,找第一个比最后一位大的偶数位来交换。
- 如果没有偶数可以换,那就输出无解。
代码
508B.cpp代码已折叠
展开折叠内容
|
- #include <iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #include<cstdlib>
- #include<climits>
- #include<queue>
- #include<vector>
- #define eps 1e+5
- #define f(i,n) for(int i=1;i<=n;++i)
- #define fi(i,t,n)for(int i=t;i<=n;++i)
- #define fd(i,n) for(int i=n;i>=1;--i)
- #define fdi(i,t,n) for(int i=n;i>=t;--i)
- #define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
- #define rforeach(i,s) for(typeof(s.rbegin()) i=s.rbegin();i!=s.rend();++i)
- #define si(n) scanf("%d",&n)
- #define dsi(n) int n;scanf("%d",&n)
- #define llu unsigned long long
- #define ci const int &
- using namespace std;
- int main()
- {
- string s;
- cin>>s;
- foreach(i,s)
- if(((*i-'0')&1)==0&&(*i<*(s.end()-1)))//fixed:是小于号//
- {
- swap(*i,*(s.end()-1));
- cout<<s;
- return 0;
- }
- rforeach(i,s)//fixed:遗漏变小情况//
- if(((*i-'0')&1)==0)
- {
- swap(*i,*(s.end()-1));
- cout<<s;
- return 0;
- }
- cout<<-1;
- }
|