测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A49761. 石头剪刀布程序命名:game.cpp

填空题 困难

题目描述

石头剪刀布

程序命名:game.cpp

题目描述

放假期间,小蓝与电脑对垒,玩起了一款经典的游戏:"石头剪刀布"。游戏规则想必大家已经非常熟悉了:两边一样则为平局,否则石头胜于剪刀;剪刀胜于布;布胜于石头。小蓝与电脑的对垒一共有n个回合,平局或败局得分为0;胜局得分取决于小蓝出手的阵容,剪刀、石头、布各有不同的分值:

出手"石头”赢的话得r点分值;

出手“剪刀”赢的话得s点分值;

出手"布"赢的话得c点分值;

但是,在第i回合中,小蓝不能使用在第(i-k)个回合中使用的阵容。(在前k个回合中,小蓝可以使用任何阵容。)

在游戏开始之前,电脑已经事先安排好了每回合比赛的阵容,而小蓝居然未卜先知了电脑的阵容!电脑的出手阵容用字符串t给出,如果第个字符(1<=i<=n)为r,则代表电脑将在第i个回合中出手"石头"。同样,c和s分别代表“布"和“剪刀”。

那么请你计算一下,小蓝在游戏中可以获得的最大分值是多少?

输入

n k

r s c

t

其中:n,k,r,s,c都是整数,t是字符串。

2<=n<=20  1<=k<=n-1  1<=r,s,c<=1000  字符串t的长度是n

输出

小蓝在游戏中可以获得的最大分值。

样例输入

5 2

8 7 6

rsrcr

样例输出

27

样例说明:

机器出手的阵容是:石头、剪刀、石头、布、石头

则小蓝出手:布、石头、石头、剪刀、布,分值为6+8+0+7+6=27分

第3回合里,小蓝不能再出第(3-2=1)回合里出过的“布”了,所以选择了平局,出手“石头”,得0分。


参考答案

//石头剪刀布 #include <iostream> using namespace std; char str1[22],str2[22]; int main(int argc, char *argv[]) { int n,k,r,s,c; cin>>n>>k>>r>>s>>c>>str1; int sum=0; for(int i=0;i<k;i++){ if(str1[i]=='r'){ str2[i]='c';sum+=c; } else if(str1[i]=='s'){ str2[i]='r';sum+=r; } else if(str1[i]=='c'){ str2[i]='s';sum+=s; } } for(int i=k;i<n;i++){ if(str1[i]=='r'){ if(str2[i-k]=='c') str2[i]='r'; else { str2[i]='c';sum+=c; } } else if(str1[i]=='s'){ if(str2[i-k]=='r') str2[i]='s'; else { str2[i]='r';sum+=r; } } else if(str1[i]=='c'){ if(str2[i-k]=='s') str2[i]='c'; else { str2[i]='s';sum+=s; } } } cout<<sum<<endl; return 0; }
上一题 下一题