投稿 资料上传 搜索
您现在的位置是: 首页 > 文章 > 正文

“科大讯飞杯”高校网络友谊赛B:伤害计算

链接:https://ac.nowcoder.com/acm/contest/5477/B
来源:牛客网

题目描述

勇士菜哭武获得了一把新的武器,武器有特殊的伤害计算方式。武器的伤害计算方式由若干个部分的和组成,用+号连接。每一部分可以是一个整数a,或者是一个公式ndx。其中a表示固定伤害a点;ndx表示掷n个x面骰子,伤害是所有骰子点数的和。总伤害是每一部分伤害的和。

比如2d6+1d70+3,表示掷两个6面骰子和一个70面骰子(不一定实际存在70面骰子,可以理解成1到70当中随机选择一个整数),再加上固定伤害3点。

他正准备挑选一把好武器,需要计算新武器的伤害期望值,想让你帮他计算一下。

输入描述:

输入一个字符串,表示伤害计算公式。字符串长度不超过5000,对于每一个部分,1≤a, n, x≤1000。a,n,x都是整数。 

输出描述:

输出一个数,表示伤害的期望值。如果不是整数,小数点后位数保留最少,即最终结果只有可能是整数或者小数点后是.5的形式,如果不是整数,那么保留一位小数。

示例1

输入

复制
1d6+1d70+1d10+6

输出

复制
50.5

解题思路:
字符串模拟一下即可,当为adb的时候期望为a*b*(b+1)/2/b,这个除以2可以放到最后再处理,当为a的时候,加上a就行了
,因为后面要处理除以2,所以这里要加上a*2。

AC代码:
#include <stdio.h>
#include <string.h>
const int N = 5050;
char str[N];
int i, len;
int f()
{
int a=0;
for(; i<len; i++)
{
if(str[i]>='0' && str[i]<='9')
a=a*10+(str[i]-'0');
else return a;
}
return a;
}
int main()
{
scanf("%s", str);
int ans = 0;
len = strlen(str);
int t=0, a, b;
for(i=0; i<len; i++) {
a=f();
if(str[i]=='d') {
i++;
b=f();
ans+=a*b*(b+1)*1.0/b;
}
else ans+=a*2;

}
printf("%d", ans/2);
if(ans%2)
printf(".5");
printf("\n");
return 0;
}





转载于:

文章标签:
阿里云服务器采购季
给作者打赏,鼓励TA抓紧创作!
评论