TopCoder SRM 354 Div1 Medium RemissiveSwaps
問題
数字に対して次の操作が好きなだけ出来る。
0でない桁を二つ選び、それぞれから1を引いたあと、それぞれを交換する。
Nが与えられたとき、操作を0回以上して得られる数のうち、最大のものを求めよ。
制約条件
N≦1000000
方針
全探索するだけ。
ソースコード
setを使ったらギリギリになってしまった。
配列でやると余裕。
int n,d[7],ans; set<int> s; void rec(){ int m=0; rep(i,n)m*=10,m+=d[i]; if(s.count(m))return; ans=max(ans,m); s.insert(m); rep(i,n)rep(j,i)if(d[i]&&d[j]){ swap(d[i],d[j]); d[i]--; d[j]--; rec(); swap(d[i],d[j]); d[i]++; d[j]++; } } class RemissiveSwaps { public: int findMaximum(int N) { ans=N; for(n=0;N;N/=10)d[n++]=N%10; reverse(d,d+n); if(n==0)d[n++]=0; s.clear(); rec(); return ans; } };