SRM 316 Div1 Easy InboxCleanup

問題概要

各メールが必要かどうかが文字列messagesによって与えられるとき、不要なメールを全て削除するのに必要な最低クリック回数を求めよ。

メーラが1ページに表示するメールの数は、最初にlow以上high以下から選ぶ。
メーラはクリック1回で以下のような操作が可能である。

  • ページに表示されているメール1通を「選択しているメールに加える」
  • 選択されているメール1通を選択しているメールから外す
  • 選択されているメールを全て削除する
  • 全てのメールを選択する
  • 次のページを表示する
解法

1ページに表示するメールの数をlow以上high以下で全て試す。
各ページでそれぞれ、全てを選択してからメールをいくつか外す方式と、削除するメールだけを選択していく方式の効率の良いほうを選べばよい。

ソースコード
	int fewestClicks(string messages, int low, int high) 
	{
		int ans=inf,n=messages.size();
		for(int a=low;a<=high;a++)
		{
			int c=n/a+(n%a!=0)-1;
			rep(i,n/a+(n%a!=0))
			{
				string s=messages.substr(i*a,a);
				int t=count(all(s),'D');
				if(t==0)continue;
				
				c+=min(t,(int)s.size()-t+1)+1;
			}
			ans=min(ans,c);
		}
		return ans;
	}
System Test

Passed.
しかし遅すぎる……orz