题目链接:http://jag2014autumn.contest.atcoder.jp/tasks/icpc2014autumn_a
题意:给一个字符串,从后向前读取。读取的指定字符串为west和north,设已经读取到数目为n。第一次读取,读到north,答案ans初始化为0,否则初始化为90。接下来读取,读到north,ans = ans-90/2^n,否则ans = ans+90/2^n。保证字符串合法,以分数形式输出最后ans。
思路:水题。一开始想过double去表示,但是可能会精度出问题。由于n比较小最大到20,所以一开始就把分母初始化为2^20,分子为2^20*90(west情况下)。主要目的是消除90/2^n中的2^n。当然n比较大的话就只能同时算分母和分子。
EA吧好像。
源码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;
int const MM = 94371840;
int const NN = 1048576;
int const MAXN = 100+5;
char s[MAXN];
int gcd(int a,int b)
{
// printf("a = %d\n",a);
// printf("b = %d\n",b);
if(a%b==0)
return b;
else
return gcd(b,a%b);
}
int main()
{
while(scanf("%s",s)!=EOF){
if(!strcmp(s,"#"))
break;
int len = strlen(s);
// printf("len = %d\n",len);
int num = 0;
int ans = MM/2;
int f = 1;
for(int i=len-1; i>=0; i--){
if(s[i]=='w' || s[i]=='n'){
int flag = s[i]=='w'?1:0;
// printf("i = %d\n",i);
if(flag){
if(f){
f=0;
ans = MM/pow(2,num);
}
else
ans+=MM/pow(2,num);
}
else{
if(f){
f=0;
ans = 0;
}
else
ans-=MM/pow(2,num);
}
if(ans>MM)
ans = MM;
else if(ans<0)
ans = 0;
// printf("ans = %d\n",ans);
num++;
}
}
// printf("ans = %d\n",ans);
if(ans==0)
printf("0\n");
else{
int les = gcd(max(ans,NN),min(ans,NN));
if(les == NN)
printf("%d\n",ans/les);
else
printf("%d/%d\n",ans/les,NN/les);
}
}
return 0;
}