4063: [Cerc2012]Darts

时间:2022-05-08
本文章向大家介绍4063: [Cerc2012]Darts,主要内容包括4063: [Cerc2012]Darts、Description、Input、Output、Sample Input、Sample Output、HINT、Source、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

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.