摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 失误原因(初次提交分数)
Anton and currency you all know ★☆☆☆☆ 答案正确 100 2015-02-23 15:22:53 遗漏情况(1)

题意

给一个很长的奇数,交换任意两位,使得其变成尽量大的偶数,问这个偶数是多少。

题解

欸这个……算是贪心吧

  1. 奇数变偶数肯定要换最后一位,然后判断前面的。
  2. 尽量比原数大,那就从高位往地位,找第一个比最后一位小的偶数位来交换。
  3. 如果无法比原数大,那就尽量变得不那么小,那就从低位往高位,找第一个比最后一位大的偶数位来交换。
  4. 如果没有偶数可以换,那就输出无解。

代码

508B.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include <iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cstdlib>
  6. #include<climits>
  7. #include<queue>
  8. #include<vector>
  9. #define eps 1e+5
  10. #define f(i,n) for(int i=1;i<=n;++i)
  11. #define fi(i,t,n)for(int i=t;i<=n;++i)
  12. #define fd(i,n) for(int i=n;i>=1;--i)
  13. #define fdi(i,t,n) for(int i=n;i>=t;--i)
  14. #define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
  15. #define rforeach(i,s) for(typeof(s.rbegin()) i=s.rbegin();i!=s.rend();++i)
  16. #define si(n) scanf("%d",&n)
  17. #define dsi(n) int n;scanf("%d",&n)
  18. #define llu unsigned long long
  19. #define ci const int &
  20. using namespace std;
  21. int main()
  22. {
  23. string s;
  24. cin>>s;
  25. foreach(i,s)
  26. if(((*i-'0')&1)==0&&(*i<*(s.end()-1)))//fixed:是小于号//
  27. {
  28. swap(*i,*(s.end()-1));
  29. cout<<s;
  30. return 0;
  31. }
  32. rforeach(i,s)//fixed:遗漏变小情况//
  33. if(((*i-'0')&1)==0)
  34. {
  35. swap(*i,*(s.end()-1));
  36. cout<<s;
  37. return 0;
  38. }
  39. cout<<-1;
  40. }

著作权声明[编辑]

关于[编辑]