SRM581 DIV2 -500points

<問題>
①コンテナが入っているか(x)、入っていないか(ー)を現す部屋の順列が与えられる。
(例)ーーxxx---
②各監視カメラが監視しているコンテナの数が与えられる。
(例){0、1,2,1}
③監視カメラが監視できる部屋の数が与えられる。監視できる部屋は連続したLになる。
 また、各監視カメラは全く同じ範囲を監視することはできない。
(例) L=3
④このとき、各部屋が監視されていれば+、監視されていなければー、どちらかわからなければ?で現される順列を返す。
 
<解き方>
・各監視カメラが監視しているコンテナの順列をsortし、同じコンテナの数を数える。
 (仮に、1が2つあればreportnum=2とする)
・同じ数のコンテナを監視している中で、各部屋を監視しているパターンの和と順列を求める。
 (仮に、1個のコンテナを監視できるパターンが10通りあればtotalnum=10とする)
 (11223211のように、その10通りのパターンで監視できる部屋の数の和を求める)
 そのとき、その順列中の数がtotalnum-reportnumより大きければ+、それ以下でかつ0以上であれば?となる。

当日は問題のexampleを2つぐらいしか見ずに解いてしまったので、上のパターンを見逃してしまいました。
コーディングにとりかかる前に、exampleは全て確認するか自分で網羅性のある例を出してイメージを膨らませることが大事だと思いました。

あと、なぜかstringの初期化コード
string ans;
FOR(i,0,n)ans+='-';
を最初書いたらエラーになるexampleがあったのに、
同じ内容を書き直してみると通ったのは不思議でした。

<ソース>
string getContainerInfo(string containers, vector<int> reports, int L) {
int n=containers.size(),reportnum=1;
string ans;
FOR(i,0,n)ans+='-';

sort(reports.begin(),reports.end());

FORE(i,0,(int)reports.size()){
if(i!=(int)reports.size()-1 && reports[i]==reports[i+1]){
reportnum++;
continue;
}


vector<int> tmp(n,0);
int totalnum=0;

FORE(j,0,n-L+1){
int count=0;
FORE(k,j,j+L)if(containers[k]=='X')count++;
if(count!=reports[i])continue;
FORE(k,j,j+L)tmp[k]++;
totalnum++;
}

FORE(j,0,n){
if(tmp[j]>totalnum-reportnum)ans[j]='+';
else if(tmp[j]>0 && ans[j]!='+')ans[j]='?';
}
reportnum=1;
}

return ans;
}

Share this

Related Posts

Previous
Next Post »