思路:直接用 string读入,以加号为间隔计算。教训是定下一种方法就要马上写出来,不能一直换呀换呀,不然很浪费时间。
题目描述
勇士菜哭武获得了一把新的武器,武器有特殊的伤害计算方式。武器的伤害计算方式由若干个部分的和组成,用+号连接。每一部分可以是一个整数a,或者是一个公式ndx。其中a表示固定伤害a点;ndx表示掷n个x面骰子,伤害是所有骰子点数的和。总伤害是每一部分伤害的和。
比如2d6+1d70+3,表示掷两个6面骰子和一个70面骰子(不一定实际存在70面骰子,可以理解成1到70当中随机选择一个整数),再加上固定伤害3点。
他正准备挑选一把好武器,需要计算新武器的伤害期望值,想让你帮他计算一下。
比如2d6+1d70+3,表示掷两个6面骰子和一个70面骰子(不一定实际存在70面骰子,可以理解成1到70当中随机选择一个整数),再加上固定伤害3点。
他正准备挑选一把好武器,需要计算新武器的伤害期望值,想让你帮他计算一下。
输入
输入一个字符串,表示伤害计算公式。字符串长度不超过5000,对于每一个部分,1≤a, n, x ≤1000。a,n,x都是整数。
输出
输出一个数,表示伤害的期望值。如果不是整数,小数点后位数保留最少,即最终结果只有可能是整数或者小数点后是.5的形式,如果不是整数,那么保留一位小数。
样例输入 Copy
1d6+1d70+1d10+6
样例输出 Copy
50.5
#include <bits/stdc++.h> using namespace std; #define ll long long const int mod=1e9+7; const int N=5e3+5; double ans; int a[N]; int main(){ ios::sync_with_stdio(0); string s; cin>>s; int n=s.size(),j=1; for(int i=0;i<n;i++) if(s[i]=='+') a[j++]=i; //cout<<j<<endl; a[0]=-1; for(int i=1;i<j;i++){ int k=a[i-1]+1,x=0,y=0; while(s[k]!='d'&&k<a[i]){ x=10*x+s[k]-'0'; k++; } k++; while(k<a[i]){ y=10*y+s[k]-'0'; k++; } //cout<<x<<' '<<y<<endl; if(y) ans+=1.0*x*(y+1)/2; else ans+=x; } int k=a[j-1]+1;int x=0,y=0; while(s[k]!='d'&&k<n){ x=10*x+s[k]-'0'; k++; } k++; while(k<n){ y=10*y+s[k]-'0'; k++; } //cout<<x<<" ."<<y<<endl; if(y) ans+=1.0*x*(y+1)/2; else ans+=x; if(floor(ans)==ans) printf("%.0lf\n",ans); else printf("%.1lf\n",ans); return 0; }