| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
HDU1367上AC的代码在这里WA#include<string.h>
#include<iostream>
#include<sstream>
#include<string>
#include<stdio.h>
#include<map>
using namespace std;
int l[2], n;
string v1[30][2], v2[30][2], v3[30][2];
char op[30][2];
int n1[30][2], n2[30][2], n3[30][2];
map<string, int>mp;
struct node
{
double t[12];
double r[2][2];
double p;
void init()
{
memset(t, 0, sizeof(t));
memset(r, 0, sizeof(r));
p = 1.0;
}
void run(int id, int o)
{
int V1, V2, V3;
double u1, u2;
V1 = mp[v1[(o - 1) / 4][id]];
V2 = mp[v2[(o - 1) / 4][id]];
V3 = mp[v3[(o - 1) / 4][id]];
if (V1)
u1 = t[V1];
else
u1 = n1[(o - 1) / 4][id];
if (V2)
u2 = t[V2];
else
u2 = n2[(o - 1) / 4][id];
switch (o % 4)
{
case 1:r[0][id] = u1; break;
case 2:r[1][id] = u2; break;
case 3:
if (op[(o - 1) / 4][id] == '+')
r[0][id] = r[0][id] + r[1][id];
else
r[0][id] = r[0][id] - r[1][id]; break;
case 0:t[V3] = r[0][id]; break;
}
}
}dp[125][125];
bool check(string s, int &a)//读取常量
{
if (s[0] - '0' >= 0 && s[0] - '0' <= 9)
{
istringstream sin(s);
sin >> a;
return 0;
}
return 1;
}
void solve()
{
int i, j, k, k1, k2;
double p1, p2, p;
node f1, f2;
dp[0][0].init();
for (i = 0; i <= l[0]; i++)
for (j = 0; j <= l[1]; j++)
{
if (i | j)
{
if (i == 0)
{
f1 = dp[i][j - 1];
p1 = f1.p*0.5; p2 = 0;
f1.run(1, j);
}
else if (j == 0)
{
f2 = dp[i - 1][j];
p2 = f2.p*0.5;
p1 = 0;
f2.run(0, i);
}
else
{
f1 = dp[i][j - 1];
f2 = dp[i - 1][j];
p1 = f1.p*(i == l[0] ? 1 : 0.5);
p2 = f2.p*(j == l[1] ? 1 : 0.5);
f1.run(1, j);
f2.run(0, i);
}
dp[i][j].p = p = p1 + p2;
for (k = 1; k <= n; k++)
{
dp[i][j].t[k] = (f1.t[k] * p1 + f2.t[k] * p2) / p;
}
for (k1 = 0; k1 <= 1; k1++)
for (k2 = 0; k2 <= 1; k2++)
{
dp[i][j].r[k1][k2] = (f1.r[k1][k2] * p1 + f2.r[k1][k2] * p2) / p;
}
}
}
for (i = 1; i <= n; i++)
if (dp[l[0]][l[1]].t[i] == 0)
printf("0.0000\n");
else
printf("%.4lf\n", dp[l[0]][l[1]].t[i]);
}
int main()
{
int ti, i, j;
char ch;
string str;
scanf("%d", &ti);
while (cin.peek() == '\n')
getchar();
while (ti--)
{
mp.clear();
for (i = 0; i <= 1; i++)
{
while (cin.peek() == '\n')//吸收多余空行
getchar();
for (j = 0; 1; j++)
{
v1[j][i] = v2[j][i] = v3[j][i] = "";
n1[j][i] = n2[j][i] = n3[j][i] = 0;
while (cin.peek() != ':'&&cin.peek() != '\n')
{
ch = getchar();
if (ch != ' ')
v3[j][i] += toupper(ch);
}
if (v3[j][i] == "END")
break;
if (check(v3[j][i], n3[j][i]) == 1)
mp[v3[j][i]]++;
for (ch = getchar(); cin.peek() == ' ';)
ch = getchar();
for (ch = getchar(); cin.peek() == ' ';)
ch = getchar();
while (cin.peek() != '+'&&cin.peek() != '-')
{
ch = getchar();
if (ch != ' ')
v1[j][i] += toupper(ch);
}
if (check(v1[j][i], n1[j][i]) == 1)
mp[v1[j][i]]++;
scanf("%c", &op[j][i]);
for (; cin.peek() == ' ';)
ch = getchar();
while (cin.peek() != ' '&&cin.peek() != '\n')
{
ch = getchar();
if (ch != ' ')
v2[j][i] += toupper(ch);
}
if (check(v2[j][i], n2[j][i]) == 1)
mp[v2[j][i]]++;
while (cin.peek() == ' ')
ch = getchar();
while (cin.peek() == '\n')
getchar();
}
l[i] = j * 4;
}
map<string, int>::iterator it = mp.begin();//map内部已排序
for (i = 1; it != mp.end(); i++, it++)
mp[it->first] = i;
n = i - 1;
solve();
if (ti!=0)
printf("\n");
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator