首页 > 技术文章 > 4063: [Cerc2012]Darts

HansBug 2015-05-08 16:04 原文

4063: [Cerc2012]Darts

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 85  Solved: 53
[Submit][Status][Discuss]

Description

考虑一个扔飞镖的游戏。板子由十个环组成,半径分别为20, 40, 60, 80, 100, 120, 140, 160, 180和200(单位:mm),均以原点为中心。每次投掷的得分取决于飞镖所击中的位置。如果包含飞镖的最小环(可以在圆上)的半径是20 * (11 - p),则得分是p。不在最外环以内的点不得分。你的任务是计算n次投掷之后的得分。

Input

第一行一个正整数T,表示有T组数据。

每组数据第一行一个正整数n,表示有n次投掷,1 <= n <= 10^6。
接下来n行,每行两个整数x和y,表示一次投掷击中的位置为(x, y),-200 <= x, y <= 200。

Output

对于每组数据输出一行,即n次投掷得分的总和。

Sample Input

1
5
32 -39
71 89
-60 80
0 0
196 89

Sample Output

29

HINT

 

Source

鸣谢Tjz

 

题解:其实是道水题= =,不过我由于担心卡精度,所以还是全部不开方,之后一个个判断,然后居然还A掉了= =

AC程序如下

 1 /**************************************************************
 2     Problem: 4063
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:1372 ms
 7     Memory:224 kb
 8 ****************************************************************/
 9  
10 var i,j,k,l,m,n,ans:longint;
11 function doit(x,y:longint):longint;
12          var z,i:longint;
13          begin
14               doit:=0;z:=x*x+y*y;
15               for i:=10 downto 1 do if z<=(400*(11-i)*(11-i)) then exit(i)
16          end;
17 begin
18      readln(m);
19      for i:=1 to m do
20          begin
21               readln(n);ans:=0;
22               for j:=1 to n do
23                   begin
24                        readln(k,l);
25                        inc(ans,doit(k,l));
26                   end;
27               writeln(ans);
28          end;
29 end.

但是按照我原来思路的程序却狂WA不止,求神犇解释orz:

 1 /**************************************************************
 2     Problem: 4063
 3     User: HansBug
 4     Language: Pascal
 5     Result: Wrong_Answer
 6 ****************************************************************/
 7 var i,j,k,l,m,n,ans:longint;
 8 function doit(x,y:longint):longint;
 9          begin
10               doit:=(10-(trunc(sqrt(sqr(x)+sqr(y)))-1) div 20);
11               if doit<0 then doit:=0;
12          end;
13 begin
14      readln(m);
15      for i:=1 to m do
16          begin
17               readln(n);ans:=0;
18               for j:=1 to n do
19                   begin
20                        readln(k,l);
21                        inc(ans,doit(k,l));
22                   end;
23               writeln(ans);
24          end;
25 end.

 

推荐阅读