Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 85 Solved: 53
考虑一个扔飞镖的游戏。板子由十个环组成,半径分别为20, 40, 60, 80, 100, 120, 140, 160, 180和200(单位:mm),均以原点为中心。每次投掷的得分取决于飞镖所击中的位置。如果包含飞镖的最小环(可以在圆上)的半径是20 * (11 - p),则得分是p。不在最外环以内的点不得分。你的任务是计算n次投掷之后的得分。
第一行一个正整数T,表示有T组数据。
每组数据第一行一个正整数n,表示有n次投掷,1 <= n <= 10^6。
接下来n行,每行两个整数x和y,表示一次投掷击中的位置为(x, y),-200 <= x, y <= 200。
对于每组数据输出一行,即n次投掷得分的总和。
1 5 32 -39 71 89 -60 80 0 0 196 89
29
题解:其实是道水题= =,不过我由于担心卡精度,所以还是全部不开方,之后一个个判断,然后居然还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.