SRM579 DIV2 -550points

<問題>
①複数の単語が与えられる。
②ディスプレイ・入力画面、UNDO領域の3つが与えられる。
③キー入力は入力画面に現れ、ENTERボタンを1回クリックでディスプレイに表示。
④一度入力した文字は2回の操作でUNDOから呼び出せる。
⑤与えられた単語を順にディスプレイに表示するとき、最小の操作回数を返す。

<関数>
line[i].substr(0,line[i-1])
単語の一致判定に部分文字列を利用

for(k=0;k<min((int)lines[i].size(), (int)lines[j].size());k++)
単語の判定でループを回す際は、終了条件に単語の長さを考慮

<考え方>
①単語ごとにENTERボタン1回は必ず必要。
②次の単語を入力する際の方法は3通り。
 1.UNDOで””を呼び出してから、新しい単語を1から入力
 2.UNDOで”tp”など次の単語の一部を呼び出してから残りの文字を入力
 3.前の単語から文字を足すだけで次の単語になる場合は、そのまま続けて入力

この操作をそのままプログラムにします。


int minPresses(vector<string> lines) {
int n=lines.size();
int ans=lines[0].size()+1;

FORE(i,1,n){
int cost=lines[i].size()+1+2;
FORE(j,0,i){
int k;
for(k=0;k<min((int)lines[i].size(), (int)lines[j].size());k++)
if(lines[i][k]!=lines[j][k])break;
cost=min(cost, (int)lines[i].size()-k+1+2);
}
if(lines[i].substr(0,lines[i-1].size())==lines[i-1])
cost=min(cost,(int)lines[i].size()-(int)lines[i-1].size()+1);
ans+=cost;
}
return ans;

Share this

Related Posts

Previous
Next Post »