题目描述
勇士菜哭武获得了一把新的武器,武器有特殊的伤害计算方式。武器的伤害计算方式由若干个部分的和组成,用+号连接。每一部分可以是一个整数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
不知道说啥,就模拟着做,注意输出的时候要是整数就直接输出,小数的话就先变成整数,后面加个. 5。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
const int inf=0x3f3f3f3f;
double sum=0.0;
double res(int x)
{
double s=0;
for(double i=1;i<=x;i++)
s+=i;
return s;
}
int main()
{
cout.setf(ios::fixed);
cout<<setprecision(1);
string str;
cin>>str;
while(1)
{
int dex=str.find('+');
if(dex==-1)
{
double n=0,num=0;int pos;
if(str.find('d')==-1)
{
for(int i=0;i<str.size();i++)
n=n*10+str[i]-'0';
sum+=n;
}
else
{
for(int i=0;i<str.size();i++)
if(str[i]=='d')
{
pos=i;
}
for(int i=0;i<pos;i++)
n=n*10+str[i]-'0';
for(int i=pos+1;i<str.size();i++)
num=num*10+str[i]-'0';
sum+=n*(res(num)/num);
}
break;
}
string st=str.substr(0,dex);
int pos;double n=0,num=0;
if(str.find('d')==-1)
{
for(int i=0;i<st.size();i++)
n=n*10+st[i]-'0';
sum+=n;
}
else
{
for(int i=0;i<st.size();i++)
if(st[i]=='d')
{
pos=i;
}
for(int i=0;i<pos;i++)
n=n*10+st[i]-'0';
for(int i=pos+1;i<st.size();i++)
num=num*10+st[i]-'0';
sum+=n*(res(num)/num);
}
str=str.substr(dex+1);
}
if((int)(sum)==sum)cout<<(int)sum<<endl;
else cout<<(int)sum<<".5"<<endl;
system("pause");
return 0;
}
越打感觉自己越菜,菜的头晕