Topcoder SRM 568 div2
ふたつとけた。
250
10*n + 1 が次のsimilarではない番号なので、そんなかんじにやればOK
#include <iostream> #include <cstdio> #include <iomanip> #include <vector> #include <list> #include <map> #include <set> #include <queue> #include <bitset> #include <stack> #include <utility> #include <numeric> #include <algorithm> #include <functional> #include <cctype> #include <complex> #include <string> #include <sstream> using namespace std; #define all(c) c.begin(),c.end() #define rall(c) c.rbegin(),c.rend() #define rep(i,n) for(unsigned int i=0;i<(n);i++) #define tr(it,container) for(typeof(container.begin()) it = container.begin(); \ it != container.end(); ++it) #define mp(a,b) make_pair((a),(b)) typedef long long ll; typedef complex<double> P; const int dx[] = {1,0,-1,0}; const int dy[] = {0,-1,0,1}; const double EPS = 1e-9; const int days[] = {31,28,31,30,31,30,31,31,30,31,30,31}; const int daysleap[] = {31,29,31,30,31,30,31,31,30,31,30,31}; class TheSimilarNumbers { public: int find(int lower, int upper) { int cnt = 0; for(int i=lower;i<=upper;){ i = i * 10 + 1; cnt++; } return cnt; } };
500
問題を読みちがえた。本当にひどい。
n = 50なので、全部試せばいい。O(n^4)なので大丈夫。
たぶん、nがもうちょっと大きくなったらO(n^3)解法にする必要がありそう。
事前に計算しておけばだいじょうぶそう。
#include <iostream> #include <cstdio> #include <iomanip> #include <vector> #include <list> #include <map> #include <set> #include <queue> #include <bitset> #include <stack> #include <utility> #include <numeric> #include <algorithm> #include <functional> #include <cctype> #include <complex> #include <string> #include <sstream> using namespace std; #define all(c) c.begin(),c.end() #define rall(c) c.rbegin(),c.rend() #define rep(i,n) for(unsigned int i=0;i<(n);i++) #define tr(it,container) for(typeof(container.begin()) it = container.begin(); \ it != container.end(); ++it) #define mp(a,b) make_pair((a),(b)) typedef long long ll; typedef complex<double> P; const int dx[] = {1,0,-1,0}; const int dy[] = {0,-1,0,1}; const double EPS = 1e-9; class BallsSeparating { public: int minOperations(vector <int> red, vector <int> green, vector <int> blue) { int N = red.size(); if(N <= 2) return -1; int sum = 1000000000; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ for(int k=0;k<N;k++){ if(i==j or j==k or k==i) continue; int cnt = 0; cnt += blue[i]+green[i]; cnt += red[j]+green[j]; cnt += blue[k]+red[k]; for(int z=0;z<N;z++){ if(z == i or z == j or z == k) continue; cnt += red[z]+green[z]+blue[z]; cnt -= max(red[z],max(green[z],blue[z])); } sum = min(sum,cnt); } } } return sum; } };