4063: [Cerc2012]Darts
4063: [Cerc2012]Darts
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 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
5
32 -39
71 89
-60 80
0 0
196 89
Sample Output
29
HINT
Source
题解:其实是道水题= =,不过我由于担心卡精度,所以还是全部不开方,之后一个个判断,然后居然还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.