2013ACM/ICPC湘潭多省程序设计竞赛暨湘潭市第五届大学生程序设计竞赛

Hurry Up

Accepted : 6 Submit : 43
Time Limit : 1000 MS Memory Limit : 65536 KB

Problem Description

GG is some what afraid of his MM. Once his MM asks, he will always try his best to rush to their home.
Obvious, he can run home in straight line directly. Alternatively, he can run to the main road and call the taxi.
You can assume there is only one main road on the x-axis, with unlimited length.
Given the initial location of GG and his destination, please help to ask the minimize time to get home.
GG will always run at the fixed speed of vr, and the taxi can move at the fixed speed of vt
You can also assume that, only GG reach the main road, he can catch the taxi immediately. And the taxi will go towards home ( not necessay along the road ).
Bisides, GG can run arbitrary length, and pay arbitrarily for the taxi.

P.S. MM: abbr. Ma Ma

Input

Multiple test cases. First line, an integer T ( 1 ≤ T ≤ 2000 ), indicating the number of test cases.
For each test cases, there are 6 integers x1, y1, x2, y2, vr, vt in a line.
( -1000 <= x1, y1, x2, y2 <= 1000, 1 <= vr < vt <= 1000 )
(x1, y1) : the initial location of GG
(x2, y2) : the destination location of GG
vr: GG's run speed
vt: taxi's speed

Ouput

For each test case, output a real number with 2 digits after the arithmetic point. It is the shorest time for GG to reach home.

Sample Input
2
1 1 2 2 1 2
1 1 2 2 1 7
Sample Output
1.41
1.32


#include <stdio.h>
#include <math.h>
#define inf 1e-10
double xo,yo,x2,y2,vr,vt;


double dis(double a,double b,double c,double d)
{
   return  sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double talk(double ex,double ey)
{
    return dis(xo,yo,ex,ey)/vr;
}
double taxi(double sx,double sy)
{
   return dis(sx,sy,x2,y2)/vt;
}
double calc(double x)
{
    // f(x) = -(x-3)^2 + 2;
    double a=(x-xo)*(x-xo)+yo*yo;
    double b=(x-x2)*(x-x2)+y2*y2;
    return sqrt(a)/vr+sqrt(b)/vt;
}
double ternarySearch(double low, double high)
{
    double mid, midmid;
    while (low + inf < high)
    {
        mid = (low + high) / 2;
        midmid = (mid + high) / 2;
        double mid_value = calc(mid);
        double midmid_value = calc(midmid);
        if (mid_value <= midmid_value)
            high = midmid;
        else
            low = mid;
    }
    return low;
}


int main()
{
   int n;
   scanf("%d",&n);
   double  onlytalk,twoway=0,temp,m;
   while(n--)
   {
      scanf("%lf%lf%lf%lf%lf%lf",&xo,&yo,&x2,&y2,&vr,&vt);
      //printf("%lf%lf%lf%lf%lf",xo,yo,x2,y2,vr,vt);
      temp=dis(xo,yo,x2,y2);
      onlytalk=temp/vr;//只步行
      if(xo<x2)
      m=ternarySearch(xo,x2);//搭车的点
      else
      m=ternarySearch(x2,xo);//搭车的点
      twoway=talk(m,0.0)+taxi(m,0.0);
      printf("%.2lf\n",(onlytalk<twoway?onlytalk:twoway));
   }
   return 0;
}



陆军棋,又称陆战棋,简称军棋,是中国近代的一种两人棋类,设计根据军队中的军阶。每一方有25枚棋子,先夺得对方军旗者为胜。
棋子
每一方的棋子为25枚,包括:

军阶高低棋子名称各方枚数特殊能力
1司令1
2军长1
3师长2
4旅长2
5团长2
6营长2
7连长3
8排长3
9工兵3铁路上格数不限并可转弯,攻击胜过地雷
M地雷3不能移动,胜过其他一切攻击棋子,工兵/炸弹除外
B炸弹2遇到敌方棋子皆同归于尽,军旗也不例外
F军旗1不能移动,被攻击则拥有者输掉游戏

胜负一览
司令 > 军长 > 师长 > 旅长 > 团长 > 营长 > 连长 > 排长 > 工兵
炸弹与任何棋子相遇时,双方都消失
工兵 > 地雷
地雷 > 除炸弹和工兵以外的任何子粒
题目要求
请你帮忙判断两个棋子相碰时,谁出局。

输入

多组测试数据,每组数据占一行
每行有两个数字或字母,之间用空格隔开,表示前者经过移动,与后者相碰。

1 表示司令
2 表示军长
3 表示师长
4 表示旅长
5 表示团长
6 表示营长
7 表示连长
8 表示排长
9 表示工兵
M 表示地雷
B 表示炸弹
F 表示军旗
输出

对于每组数据输出一行,为两人的官阶比较结果
1 表示前者官阶比后者大
-1 表示前者官阶比后者小
0 表示两人同归于尽
Error 表示出错(军旗和地雷不能主动移动)
Bingo 表示前者获得胜利(扛取对方军旗)

样例输入
1 2
B M
9 1
B F
1 F
M 1
F 1
样例输出
1
0
-1
Bingo
Bingo
Error
Error
#include <stdio.h>
#include <math.h>
char a[2],b[2];
int main()
{
   while(~scanf("%s%s",a,b))
   {
      if(a[0]=='M'||a[0]=='F')
      {printf("Error\n");continue;}
      if(b[0]=='F')//军旗
         {printf("Bingo\n");continue;}

      if(a[0]=='B'||b[0]=='B')
      {printf("0\n");continue;}
      if(a[0]=='9'&&b[0]=='M')//工兵 地雷
         {printf("1\n");continue;}
      if(b[0]=='M')
       {printf("-1\n");continue;}

      if(a[0]>b[0])
         printf("-1\n");
      else if(a[0]==b[0])
       printf("0\n");
      else
       printf("1\n");

   }
   return 0;
}

Five Tiger

Accepted : 8 Submit : 10
Time Limit : 1000 MS Memory Limit : 65536 KB

题目描述

五虎棋是流传在东北民间的一种游戏,GG小的时候,经常被表哥虐得很惨。
由于各个地区的规则可能不大相同,并且GG的回忆不一定很准,所以,如果规则和你平常玩的的有冲突,请以这里为主。
棋盘是横五条,纵五条直线,形成25个交叉点,双方轮流把棋子放到交叉点上 (由于所需各自和棋子数目不多,才12+13,GG小的时候,用的是象棋的棋盘和棋子,真的用大棋盘很爽~~~)
当双方把棋盘下满之后(先手下了13个棋子,后手下了12个棋子),根据双方摆成的阵型来算分。 (当然,算分之后,还有提掉对方相应个数的棋子,然后棋子一格一格的挪动,继续形成阵型,提掉对方的棋子神码的,GG表述不明白,也就不再后续问题上出题了)
现在GG想让你帮忙算,双方摆成的阵型,分别得分多少?

其中记分的阵型有(用o表示棋子落点)
大五虎(10分)
要求占据了四个角落和最中间的位置

o...o
.....
..o..
.....
o...o

五虎(5分):
摆成形如下图的阵势

o.o
.o.
o.o

通天(5分):
横着/竖着/斜着 五个棋子连成一条直线,如

.....	..o..	o....
ooooo	..o..	.o...
.....	..o..	..o..
.....	..o..	...o.
.....	..o..	....o

四斜(4分):
严格定义,GG说不明白,总之只有以下四种

...o.	.....	.....	.o...
..o..	o....	....o	..o..
.o...	.o...	...o.	...o.
o....	..o..	..o..	....o
.....	...o.	.o...	.....

三斜(3分):
严格定义,GG说不明白,总之只有以下四种

..o..	.....	.....	..o..
.o...	.....	.....	...o.
o....	o....	....o	....o
.....	.o...	...o.	.....
.....	..o..	..o..	.....

小斗(1分):
四个棋子形成一个最小正方形

oo
oo

例1

o...o
.o.o.
..o..
.oooo
o..oo

o这名玩家形成了 1个大五虎(10分), 1个小五虎(5分), 2个通天(10分), 1个小斗(1分). 总分:10 + 5 + 10*2 + 1 = 36

例2

.o.o.
o.o.o
.o.o.
o.o.o
.o.o.

o这名玩家形成了 4个小五虎, 4个四斜 总分 5*4 + 4*4 = 36

输入

多组测试数据。首先是一个整数T ( 1 ≤ T ≤ 10000 ),占一行,表示测试数据的组数.
对于每组测试数据,占6行。 首先是一个空行 接下来的五行,表示一个局势。 也就是说,每行5个字符(x表示先手, o表示后手,也就是说,会有13个x和12个o)

输出

对于每组测试数据,输出一行. 结果为两个整数,之间用一个空格隔开,分别表示先手(x)的得分,和后手(o)的得分。

样例输入
2

oxxxo
xoxox
xxoxx
xoooo
oxxoo

xoxox
oxoxo
xoxox
oxoxo
xoxox
样例输出
9 26
57 36


#include <stdio.h>
#include <math.h>
char a[6][6];
int check(char ch)
{
   int sum=0,k,l;
   if(a[0][0]==ch&&a[2][2]==ch&&a[4][4]==ch&&a[4][0]==ch&&a[0][4]==ch)
    sum+=10;//大五虎
   for(k=0;k<=2;k++)
      for(l=0;l<=2;l++)//五虎
      {
         if(a[k][l]==ch&&a[k+1][l+1]==ch&&a[k+2][l+2]==ch&&a[k+2][l]==ch&&a[k][l+2]==ch)
            sum+=5;
      }
      for(k=0;k<5;k++)//通天
      {
         for(l=0;l<5;l++)
           if(a[k][l]!=ch)
           break;
         if(l==5)
            sum+=5;
         for(l=0;l<5;l++)//通天vertical
          if(a[l][k]!=ch)
           break;
         if(l==5)
            sum+=5;
      }
      for(k=0;k<5;k++)//通天 斜的1
         if(a[k][k]!=ch)
          break;
         if(k==5)
            sum+=5;
       for(k=0;k<5;k++)//通天 斜的2
         if(a[4-k][k]!=ch)
          break;
         if(k==5)
            sum+=5;
         for(k=0;k<4;k++)// 四斜 斜的1
          if(a[3-k][k]!=ch)
          break;
          if(k==4)
            sum+=4;
         for(k=1;k<5;k++)// 四斜 斜的2
          if(a[k][k-1]!=ch)
          break;
          if(k==5)
            sum+=4;
        for(k=1;k<5;k++)// 四斜 斜的3
          if(a[5-k][k]!=ch)
          break;
          if(k==5)
            sum+=4;
         for(k=0;k<4;k++)// 四斜 斜的4
          if(a[k][k+1]!=ch)
          break;
          if(k==4)
            sum+=4;

         for(k=0;k<3;k++)// 三 斜的1
          if(a[2-k][k]!=ch)
          break;
          if(k==3)
            sum+=3;
         for(k=2;k<5;k++)// 三斜 斜的2
          if(a[k][k-2]!=ch)
          break;
          if(k==5)
            sum+=3;
                            // 三斜 斜的3
          if(a[4][2]==ch&&a[3][3]==ch&&a[2][4]==ch)
            sum+=3;
          if(a[0][2]==ch&&a[1][3]==ch&&a[2][4]==ch)// 三斜 斜的4
            sum+=3;
            
          for(k=0;k<=3;k++)
           for(l=0;l<=3;l++)
          {
             if(a[k][l]==ch&&a[k][l+1]==ch&&a[k+1][l]==ch&&a[k+1][l+1]==ch)
               sum+=1;
          }


   return sum;
}
int main()
{
   int n,i;
   scanf("%d",&n);
   while(n--)
   {
      for(i=0;i<5;i++)
        {
           scanf("%s",a[i]);
        }
       printf("%d %d\n",check('x'),check('o'));

   }
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值