atcoder ABC149

6632 ワード

A stringでサポートされている加算で2つの文字列を加算すればよい.B c<=a a=a-cの場合.c>a a=0の場合、b=max(0,b-(c-a));C範囲内の素数は、エジプトふるいまたはオーふるいで見つけ、与えられた数以上の最小素数を見つければよい.D原題転送ゲート欲張りでいい、欲張り策略:前後2回間隔kのラウンドで同じものを出すことができないため、連続m回同じ手に対して、せいぜい(m+1)/2回しか勝つことができない.すべてのラウンドをk間隔で巡って、それぞれ勝つことができる3つのラウンド数を集計すればよい.
ACコード:
#include 
#include 
#include 
using namespace std;
map<char,int> ans;	//       (r),  (s), (p)    。
int main(){
	int n,k;
	int a1,a2,a3;
	cin>>n>>k;
	cin>>a1>>a2>>a3;	//      ,  ,       。
	string s;
	cin>>s;
	for(int i=0;i<k;i++){		// k         
		int left=i,cnt=0;		//left             ,cnt            
		for(int j=i;j<s.size();j=j+k){
			if(s[j]==s[left])	cnt++;		//  , cnt 1,  
			else{
				ans[s[left]]+=(cnt+1)/2;
				cnt=1;
				left=j;	//        cnt,      。
			}
		}		
		ans[s[left]]+=(cnt+1)/2;	
	}
	int Ans=ans['r']*a3+ans['s']*a1+ans['p']*a2;	//         ,  r  P   ,   ans['r']*a3;
	cout<<Ans<<endl;
	return 0;
}

E