摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
Ternary Password ★★☆☆☆ 答案正确 100 2015-2-21 17:02:16

(AC 527)

题意

一个只有0,1,2的字符串,改动尽量少的位数,得到有n个0,m个1的字符串,求改动次数和最终结果。

题解

  • 很明显的贪心,首先优先使得0变1或1变0,如果仍然没有达到要求则再考虑2。写起来条件分支比较多一点。
  • 不可能的情况需要特判一下。

代码

546.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<string>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. #define si(n) scanf("%d",&n)
  7. #define dsi(n) int n;si(n)
  8. #define f(i,n) for(int i=1;i<=n;++i)
  9. #define fi(i,p,n) for(int i=p;i<=n;++i)
  10. #define fd(i,n) for(int i=n;i!=0;--i)
  11. #define fdi(i,p,n) for(int i=n;i>=p;--i)
  12. int countS[3]={},maxA=0,b=0;
  13. int main()
  14. {
  15. dsi(n);
  16. dsi(a0);
  17. dsi(a1);
  18. string str;cin>>str;
  19. fi(i,0,str.size()-1)
  20. ++countS[str[i]-'0'];
  21. if(a0+a1>str.size())
  22. {
  23. cout<<-1;
  24. return 0;
  25. }
  26. //0<->1//
  27. fi(i,0,str.size()-1)
  28. {
  29. switch(str[i])
  30. {
  31. case '0':
  32. if(countS[0]>a0&&countS[1]<a1)
  33. {
  34. --countS[0];
  35. ++countS[1];
  36. str[i]='1';++b;
  37. }
  38. break;
  39. case '1':
  40. if(countS[1]>a1&&countS[0]<a0)
  41. {
  42. --countS[1];
  43. ++countS[0];
  44. str[i]='0';++b;
  45. }
  46. break;
  47. }
  48. }
  49. //0<->2&&1<->2//
  50. fi(i,0,str.size()-1)
  51. {
  52. switch(str[i])
  53. {
  54. case '0':
  55. if(countS[0]>a0)
  56. {
  57. --countS[0];
  58. str[i]='2';++b;
  59. }
  60. break;
  61. case '1':
  62. if(countS[1]>a1)
  63. {
  64. --countS[1];
  65. str[i]='2';++b;
  66. }
  67. break;
  68. case '2':
  69. if(countS[1]<a1)
  70. {
  71. ++countS[1];
  72. str[i]='1';++b;
  73. }
  74. else if(countS[0]<a0)
  75. {
  76. ++countS[0];
  77. str[i]='0';++b;
  78. }
  79. break;
  80. }
  81. }
  82. cout<<b<<endl<<str;
  83. }

著作权声明[编辑]

关于[编辑]