Easy
ABC三種類の文字からなる文字列が存在する。
先頭からi文字目以降に何種類の文字があるかを格納したvectorを返す。
解法
ケツからみていくだけです。
提出コード
Medium
n行m列の行列がある。
各行、各列ごとに最大1羽、アヒルが居る。
アヒルを移動させて、縦でも横でもいいから整列させたい。
アヒルは、移動先が空いていればどこへでも移動が可能で、移動にかかる時間はハミルトン距離によって算出される。
整列するのにかかる最小の時間を求めよ。
解法
どういう整列のさせ方をするかが決まれば、その整列の実現にかかる最小の時間は一意に定まる。
よって、全通り試して最小の時間を返せばよい。
より具体的には、例えば横に並べる場合、最も左に居るアヒルを列の最も左に移動させ、そのアヒルの次に最も左に居るアヒルをその右へ移動させ。。。と整列させる。
縦に並べる場合も同じである。
この整列のさせ方が最小の時間を取ることは、図を書けば直ちに分かる。
実装では、二次元の構造体にアヒルの位置を記憶させ、vectorにしまったのち、xとyそれぞれに対してバブルソートを行わせる関数を実装して対処した。
提出コード
先頭からi文字目以降に何種類の文字があるかを格納したvectorを返す。
解法
ケツからみていくだけです。
提出コード
#include <algorithm> #include <iostream> #include <map> #include <numeric> #include <set> #include <sstream> #include <string> #include <vector> #include <cstring> #include <cstdio> #include <cstdlib> #include <stack> #include <deque> #include <queue> #include <functional> using namespace std; #define REP(i,s,e) for (int i = int(s); i != int(e); i++) #define rep(i,e) REP(i,0,e) #define foreach(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++) #define ALL(c) ((c).begin(), (c).end()) #define ll long long #define VI vector<int> class CheatingQuiz { public: vector<int> howMany(string answers) { int count = 0; bool abc[3]; memset(abc,false,sizeof(abc)); vector<int> ans; for(int i = answers.length()-1; i >= 0;i--){ if(count == 3){ ans.push_back(3); continue; } switch(answers[i]){ case 'A': if(!abc[0]){ abc[0] = true; count++; } break; case 'B': if(!abc[1]){ abc[1] = true; count++; } break; case 'C': if(!abc[2]){ abc[2] = true; count++; } break; } ans.push_back(count); } reverse( ans.begin(), ans.end() ); return ans; } };
Medium
n行m列の行列がある。
各行、各列ごとに最大1羽、アヒルが居る。
アヒルを移動させて、縦でも横でもいいから整列させたい。
アヒルは、移動先が空いていればどこへでも移動が可能で、移動にかかる時間はハミルトン距離によって算出される。
整列するのにかかる最小の時間を求めよ。
解法
どういう整列のさせ方をするかが決まれば、その整列の実現にかかる最小の時間は一意に定まる。
よって、全通り試して最小の時間を返せばよい。
より具体的には、例えば横に並べる場合、最も左に居るアヒルを列の最も左に移動させ、そのアヒルの次に最も左に居るアヒルをその右へ移動させ。。。と整列させる。
縦に並べる場合も同じである。
この整列のさせ方が最小の時間を取ることは、図を書けば直ちに分かる。
実装では、二次元の構造体にアヒルの位置を記憶させ、vectorにしまったのち、xとyそれぞれに対してバブルソートを行わせる関数を実装して対処した。
提出コード
#include <algorithm> #include <iostream> #include <map> #include <numeric> #include <set> #include <sstream> #include <string> #include <vector> #include <cstring> #include <cstdio> #include <cstdlib> #include <stack> #include <deque> #include <queue> #include <functional> using namespace std; #define REP(i,s,e) for (int i = int(s); i < int(e); i++) #define rep(i,e) REP(i,0,e) #define foreach(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++) #define ALL(c) (c).begin(), (c).end() #define ll long long #define VI vector<int> #define INF 1<<30 typedef struct pos{ int x; int y; int hamiltone_distance(int _x, int _y){ return (abs(x - _x) + abs(y - _y)); } }; void sort_column(vector<pos>& s){ bool recursive = false; REP(i,1,s.size()){ if(s[i-1].y > s[i].y){ swap(s[i],s[i-1]); recursive = true; } } if(recursive) sort_column(s); } void sort_row(vector<pos>& s){ bool recursive = false; REP(i,1,s.size()){ if(s[i-1].x > s[i].x){ swap(s[i],s[i-1]); recursive = true; } } if(recursive) sort_column(s); } class DucksAlignment { public: int minimumTime(vector<string> grid) { int ans = INF; int column = grid.size(); int row = grid[0].length(); vector<pos> ret; rep(i,column) rep(j,row){ if(grid[i][j] == 'o'){ pos tmp = {j,i}; ret.push_back(tmp); } } int sum; sort_row(ret); rep(i,column) rep(j,row-ret.size()+1){ sum = 0; rep(k,ret.size()) sum += ret[k].hamiltone_distance(j+k,i); ans = min(sum,ans); } swap(column,row); sort_column(ret); rep(i,column) rep(j,row-ret.size()+1){ sum = 0; rep(k,ret.size()) sum += ret[k].hamiltone_distance(i,j+k); ans = min(sum,ans); } return ans; } };
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。