题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 需要注意 |
---|---|---|---|---|---|
Ternary Password | ★★☆☆☆ | 答案正确 | 100 | 2015-2-21 17:02:16 | 无 |
(AC 527)
一个只有0,1,2的字符串,改动尽量少的位数,得到有n个0,m个1的字符串,求改动次数和最终结果。
546.cpp代码已折叠
展开折叠内容
|
---|
#include<cstdio> #include<string> #include<iostream> #include<algorithm> using namespace std; #define si(n) scanf("%d",&n) #define dsi(n) int n;si(n) #define f(i,n) for(int i=1;i<=n;++i) #define fi(i,p,n) for(int i=p;i<=n;++i) #define fd(i,n) for(int i=n;i!=0;--i) #define fdi(i,p,n) for(int i=n;i>=p;--i) int countS[3]={},maxA=0,b=0; int main() { dsi(n); dsi(a0); dsi(a1); string str;cin>>str; fi(i,0,str.size()-1) ++countS[str[i]-'0']; if(a0+a1>str.size()) { cout<<-1; return 0; } //0<->1// fi(i,0,str.size()-1) { switch(str[i]) { case '0': if(countS[0]>a0&&countS[1]<a1) { --countS[0]; ++countS[1]; str[i]='1';++b; } break; case '1': if(countS[1]>a1&&countS[0]<a0) { --countS[1]; ++countS[0]; str[i]='0';++b; } break; } } //0<->2&&1<->2// fi(i,0,str.size()-1) { switch(str[i]) { case '0': if(countS[0]>a0) { --countS[0]; str[i]='2';++b; } break; case '1': if(countS[1]>a1) { --countS[1]; str[i]='2';++b; } break; case '2': if(countS[1]<a1) { ++countS[1]; str[i]='1';++b; } else if(countS[0]<a0) { ++countS[0]; str[i]='0';++b; } break; } } cout<<b<<endl<<str; } |