SRM 526 DIV1 Easy - DucksAlignment (復習○)

問題


http://community.topcoder.com/stat?c=problem_statement&pm=11667&rd=14551

四角形のマスにダチョウが複数存在する。
ダチョウを縦か横に一列に並べるとき、必要な最小移動数を求める。

解き方


縦に並べるときと横に並べるときの2通りを試し小さい方を返す。
縦と横それぞれに対して、並べる列/行と詰めるときの移動数を求めてあげればよい。

コード



class DucksAlignment {

public: int minimumTime(vector<string> grid) {
int h=grid.size(),w=grid[0].size();
vector<int> tate,yoko;

FORE(i,0,h){
FORE(j,0,w){
if(grid[i][j]=='o'){
tate.push_back(i);
yoko.push_back(j);
}
}
}
sort(tate.begin(),tate.end());
sort(yoko.begin(),yoko.end());

//move to one column
int tate1=1e+8,yoko1=1e+8;
FORE(i,0,h){
int tmp=0;
FORE(k,0,tate.size())tmp+=abs(i-tate[k]);
tate1=min(tate1,tmp);
}
FORE(i,0,w-yoko.size()+1){
int tmp=0,cur=i;
FORE(j,0,yoko.size()){
tmp+=abs(yoko[j]-cur);
cur++;
}
yoko1=min(yoko1,tmp);
}
int ans1=tate1+yoko1;

//move to one row
int tate2=1e+8,yoko2=1e+8;
FORE(i,0,w){
int tmp=0;
FORE(k,0,yoko.size())tmp+=abs(i-yoko[k]);
yoko2=min(yoko2,tmp);
}
FORE(i,0,h-tate.size()+1){
int tmp=0,cur=i;
FORE(j,0,tate.size()){
tmp+=abs(tate[j]-cur);
cur++;
}
tate2=min(tate2,tmp);
}
int ans2=tate2+yoko2;

return min(ans1,ans2);
}

};
このエントリーをはてなブックマークに追加