1203: 伤害计算

思路:直接用 string读入,以加号为间隔计算。教训是定下一种方法就要马上写出来,不能一直换呀换呀,不然很浪费时间。

题目描述

勇士菜哭武获得了一把新的武器,武器有特殊的伤害计算方式。武器的伤害计算方式由若干个部分的和组成,用+号连接。每一部分可以是一个整数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的形式,如果不是整数,那么保留一位小数。 

样例输入 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;
}

猜你喜欢

转载自www.cnblogs.com/asunayi/p/12898249.html