24h購物| | PChome| 登入
2013-06-13 07:28:53| 人氣665| 回應0 | 上一篇 | 下一篇

[UVA][遞迴] 11291 - Smeech

推薦 0 收藏 0 轉貼0 訂閱站台

Problem B: Smeech

Professor Octastichs has invented a new programming language, Smeech. An expression in Smeech may be a positive or negative integer, or may be of the form (p e1 e2) where p is a real number between 0 and 1 (inclusive) and e1 and e2 are Smeech expressions. The value represented by a Smeech expression is as follows:
  • An integer represents itself
  • With probability p, (p e1 e2) represents x+y where x is the value of e1 and y is the value of e2; otherwise it represents x-y.
Given a Smeech expression, what is its expected value?

Input consists of several Smeech expressions, one per line, followed by a line containing (). For each expression, output its expected value to two decimal places.

Sample Input

7
(.5 3 9)
()

Output for Sample Input

7.00
3.00

Gordon V. Cormack

題目描述:

類似於 BNF 表示法。
<E[x]> -> <Integer> | (p <E[x]> <E[x]>)
<Integer> -> #number

然後他說有 p 的機率表示 x+y, 1-p 的機率表示 x-y
即 E[X] = p*(e1+e2) + (1-p)*(e1-e2)

題目解法:

使用遞迴去剖析字串會比較方便好寫。


#include <stdio.h>
#include <string.h>
char s[10000];
int i;
double sol() {
    if(s[i] != '(') {
        double e;
        sscanf(s+i, "%lf", &e);
        while((s[i] <= '9' && s[i] >= '0') || s[i] == '-')
            i++;
        while(s[i] == ' ')  i++;
        return e;
    }
    double p, e1, e2;
    sscanf(s+i, "(%lf", &p);
    while(s[i] != ' ')  i++;
    i++;
    e1 = sol();
    e2 = sol();
    while(s[i] != ')')  i++;
    i++;
    while(s[i] == ' ')  i++;
    return p*(e1+e2) + (1-p)*(e1-e2);
}
int main() {
    double p, e1, e2;
    while(gets(s)) {
        if(!strcmp(s, "()"))
            break;
        i = 0;
        printf("%.2lf\n", sol());
    }
    return 0;
}

台長: Morris
人氣(665) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:[UVA][字串分析] 11070 - The Good Old Times
此分類上一篇:[UVA][math] 10460 - Find the Permuted String

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文