SRM 476
まったく上がる気がしないDIV2な人。
- 300 行列回転してどうのこうの。ゲームにあったような気がする。行列を9個並べて最短のものを調べたが、他の人のコードを見て、min(r,R-r)+min(c,C-c)で余裕だった。
- 500 一瞬ナップザックかと思ったが、普通に貪欲法でおk。ところでバッジャーって何?
- 1000 全探索にて死亡。当たり前か。動的計画法らしい。500で動的計画法を思いつきながら、なぜか1000ではそのまま特攻した。1ケースだけTLEしてた。
Result
300: Passed System Test
500: Passed System Test
1000: Failed System Test
1079(+44)
300コード
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<set> #include<map> #include<cmath> #include<complex> #include<cstdlib> #define INFTY 1000000 using namespace std; class MatrixShiftings { public: int minimumShifts(vector <string> matrix, int value) { int ret = INFTY; vector<string> ex_mt; for(int i = 0; i < matrix.size(); ++i){ ex_mt.push_back(matrix[i]); for(int j = 0; j < 2; ++j){ ex_mt[i] += matrix[i]; } } for(int i = 0; i < matrix.size(); ++i){ ex_mt.push_back(ex_mt[i]); } for(int i = 0; i < matrix.size(); ++i){ ex_mt.push_back(ex_mt[i]); } // for(int i = 0; i < ex_mt.size(); ++i){ for(int j = 0; j < ex_mt[i].size(); ++j){ cout << ex_mt[i][j]; } cout << endl; } for(int i = matrix.size(); i < ex_mt.size() - matrix.size(); ++i){ for(int j = matrix[0].size(); j < ex_mt[0].size() - matrix[0].size(); ++j){ if( ex_mt[i][j] - '0' == value ){ for(int y = 0; y < ex_mt.size(); y += matrix.size()){ for(int x = 0; x < ex_mt[0].size(); x += matrix[0].size() ){ int dist = abs(y-i)+abs(x-j); ret = min( ret, dist ); } } } } } if(ret==INFTY)ret = -1; return ret; } };
500コード
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<set> #include<map> #include<cmath> #include<complex> using namespace std; #define N 54 class Badgers { public: int w[N+1][N]; int feedMost(vector <int> hunger, vector <int> greed, int totalFood) { int n = (int)hunger.size(); int ret = 0; for(int i = 1; i < n+1; ++i){ for(int j = 0; j < n; ++j){ w[i][j] = hunger[j] + (i-1) * greed[j]; } } /* for(int i = 1; i < n+1; ++i){ for(int j = 0; j < n; ++j){ cout << w[i][j] << ' '; } cout << endl; } */ for(int i = 1; i < n+1; ++i){ sort(w[i],w[i]+n); int s=0; for(int j = 0; j < i; ++j){ s+=w[i][j]; if(s>totalFood){ break; } ret = max(ret, j+1); } } return ret; } };