UVA 11291 - Smeech(概率+词法分析)

UVA 11291 - Smeech

题目链接

题意:给定一个表达式形如e=(p,e1,e2)
该表达式的值为 p?(e1+e2)+(1?p)?(e1?e2),求出值

思路:题目是很水,但是处理起来还挺麻烦的,模拟写编译器LEX分析器原理去写了。

代码:

#include <cstdio>
#include <cstring>

const int N = 100005;
char str[N];
int now, len, token;
double value;

void gettoken() {
	while (str[now] == ' ') {now++;}
	if (str[now] == '(') {
		token = 0; now++;
	}
	else if (str[now] == ')') {
		token = 1; now++;
	}
	else if ((str[now] >= '0' && str[now] <= '9') || str[now] == '.' || str[now] == '-') {
		int flag = 1;
  		if (str[now] == '-') {
    		flag = -1;
    		now++;
  		}
  		value = 0;
		token = 2;
		while (now < len && str[now] >= '0' && str[now] <= '9') {
			value = value * 10 + str[now] - '0';
			now++;
		}
		if (str[now] == '.') {
			now++;
			double mu = 10;
			while (now < len && str[now] >= '0' && str[now] <= '9') {
				value += (str[now] - '0') / mu;
				mu *= 10;
    			now++;
   			}
  		}
  		value *= flag;
 	}
}

double expr() {
	gettoken();
	if (token == 0) {
		gettoken();
		double p = value;
		double x = expr();
		double y = expr();
		gettoken();
		return p * (x + y) + (1 - p) * (x - y);
 	}
 	else return value;
}

void init() {
	now = 0;
	len = strlen(str);;
}

int main() {
	while (gets(str) && strcmp(str, "()") != 0) {
		init();
		printf("%.2lf\n", expr());
 	}
	return 0;
}

UVA 11291 - Smeech(概率+词法分析),布布扣,bubuko.com

时间: 2024-12-09 12:11:21

UVA 11291 - Smeech(概率+词法分析)的相关文章

UVA 11291 Smeech

[来源]https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2266 此题比较简单,主要工作在于字符串的分割,怎么把代码写得漂亮点才是重点,可读性很重要.利用函数atof(stdlib.h)要比一位位去拼数字要方便点. #include <iostream> #include <stdio.h> #include <

UVA - 11291 Smeech (模拟)

Description 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 (pe1e2) where p is a real number between 0 and 1 (inclusive) and

UVA 11021 - Tribles(概率递推)

UVA 11021 - Tribles 题目链接 题意:k个毛球,每个毛球死后会产生i个毛球的概率为pi,问m天后,所有毛球都死亡的概率 思路:f[i]为一个毛球第i天死亡的概率,那么 f(i)=p0+p1f(i?1)+p2f(i?1)2+...+pnf(i?1)n 然后k个毛球利用乘法定理,答案为f(m)k 代码: #include <stdio.h> #include <string.h> #include <math.h> const int N = 1005;

UVA 10288 - Coupons(概率递推)

UVA 10288 - Coupons 题目链接 题意:n个张票,每张票取到概率等价,问连续取一定次数后,拥有所有的票的期望 思路:递推,f[i]表示还差i张票的时候期望,那么递推式为 f(i)=f(i)?(n?i)/n+f(i?1)?i/n+1 化简后递推即可,输出要输出分数比较麻烦 代码: #include <cstdio> #include <cstring> #include <cmath> long long gcd(long long a, long lon

UVA 11346 - Probability(概率)

UVA 11346 - Probability 题目链接 题意:给定a,b,s要求在[-a,a]选定x,在[-b,b]选定y,使得(0, 0)和(x, y)组成的矩形面积大于s,求概率 思路:这样其实就是求xy > s的概率,那么画出图形,只要求y = s / x的原函数, y = slnx,带入两点相减就能求出面积,面积比去总面积就是概率 代码: #include <cstdio> #include <cstring> #include <cmath> int

uva 10288 - Coupons(概率)

题目链接:uva 10288 - Coupons 题目大意:给定n,为有n中兑换卷,现在每开一次箱子,就能等概率的获得其中的一种兑换卷.问说平均情况下需要开多少个箱子才能集齐n种兑换卷. 解题思路:dp[i]表示还有i种没获得,dp[i]=n?in?dp[i]+in?dp[i?1]+1 ===>dp[i]=dp[i?1]+ni #include <cstdio> #include <cstring> #include <algorithm> using names

UVA 11971 - Polygon(概率+几何概型)

UVA 11971 - Polygon 题目链接 题意:给一条长为n的线段,要选k个点,分成k + 1段,问这k + 1段能组成k + 1边形的概率 思路:对于n边形而言,n - 1条边的和要大于另外那条边,然后先考虑3边和4边形的情况,根据公式在坐标系中画出来的图,总面积为x,而不满足的面积被分成几块,每块面积为x/2k,然后在观察发现一共是k + 1块,所以符合的面积为x?x?(k+1)/2k,这样一来除以总面积就得到了概率1?(k+1)/2k 代码: #include <cstdio>

UVA 11021 - Tribles(概率)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=481&page=show_problem&problem=1962 刚开始没理解题意,看了题解之后也不太理解,现在好点了. 其实可以看作每个麻球的后代是独立的,后代的后代同理也是独立的. 一只麻球有P[j]的概率生j只后代,每只后代在i-1天后死亡的的概率是f[i-1],j只麻球即有pow(f[i-1], j)的概率在

UVA&amp;&amp;POJ离散概率练习[3]

POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问题 |00|+|01|=|0| 注意序列是环形 // // main.cpp // poj3869 // // Created by Candy on 25/10/2016. // Copyright © 2016 Candy. All rights reserved. // #include <i