芬兰木棋(Mölkky,又称芬兰木柱)是源自芬兰的一项运动。哲哲将这个运动改造成了赛博朋克单人版,现在场上一开始有 N 根立起的小木棋(上面分别标有一个非负整数),哲哲投掷一根大木棋去击倒这些小木棋以获得分数。分数规则如下:
- 如果仅击倒 1 根木棋,则得木棋上的分数。
- 如果击倒 2 根或以上的木棋,则只得击倒根数的分数。(例如击倒 5 根,则得 5 分。)
哲哲固定站在 (0,0) 点上,四周放着若干个小木棋 (Xi,Yi),坐标均为整数。每次哲哲可以朝一个方向扔出大木棋,大木棋会打倒这个方向上离哲哲最近的 k 个小木棋。哲哲游戏水平很高超,所以这个 k 可以自由控制。
请问哲哲最多能拿多少分,在获得最多分数的情况下最少需要扔出多少次大木棋?
规则与真实规则有较大出入,真实游玩时请以国际莫尔基组织的规则为准
输入格式:
输入第一行是一个正整数 N (1 ≤ N ≤ 105),表示场上一开始有 N 个木棋。
接下来 N 行,每行 3 个整数 Xi,Yi,Pi,分别表示木棋放置在 (Xi,Yi),木棋上的分数是 Pi。坐标在 32 位整数范围内,分数为小于等于 1000 的正整数。
保证 (0,0) 点没有木棋,也没有木棋重叠放置。
输出格式:
输出一行两个数,表示最多分数以及获得最多分数最少需要投掷大木棋多少次。
输入样例:
11
1 2 2
2 4 3
3 6 4
-1 2 2
-2 4 3
-3 6 4
-1 -2 1
-2 -4 1
-3 -6 1
-4 -8 2
2 -1 999
输出样例:
1022 9
代码长度限制
16 KB
Java (javac)
时间限制
1800 ms
内存限制
256 MB
Python (python3)
时间限制
800 ms
内存限制
64 MB
Python (python2)
时间限制
800 ms
内存限制
64 MB
其他编译器
时间限制
400 ms
内存限制
64 MB
C++ (clang++)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<bits/stdc++.h>
using·
namespace
·
std;
const·
int
·
MXN
·
=
·
1e5+10;
struct·
Point{
·
·
·
·
long
·
long
·
x,y;
·
·
·
·
int
·
p,t;
·
·
·
·
long
·
long
·
dis(){
·
return
·
xx+yy;}
·
·
·
·
·
bool
·
operator<(Point
·
p){
·
·
·
·
·
·
·
·
if(t==p.t){
·
·
·
·
·
·
·
·
·
·
·
·
if(t>=4&&t<=7)
·
{
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
if(xp.y>yp.x)
·
return
·
true;
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
else
·
if(xp.y<yp.x)
·
return
·
false;
·
·
·
·
·
·
·
·
·
·
·
·
}
·
·
·
·
·
·
·
·
·
·
·
·
return
·
this->dis()<p.dis();
·
·
·
·
·
·
·
·
}
·
·
·
·
·
·
·
·
else
·
return
·
t<p.t;
·
·
·
·
}
·
·
·
·
bool
·
line(Point
·
p){
·
·
·
·
·
·
·
·
if(t!=p.t)
·
return
·
false;
·
·
·
·
·
·
·
·
if(t>=0
·
&&
·
t<=3)
·
return
·
true;
·
·
·
·
·
·
·
·
else
·
return
·
xp.y==yp.x;//对角相乘判断斜率
·
·
·
·
·
}
·
·
·
·
void
·
init(){
·
·
·
·
·
·
·
·
if(x*y==0){
·
·
·
·
·
·
·
·
·
·
·
·
if(x==0)
·
t=y>0
·
?
·
0:1;
·
·
·
·
·
·
·
·
·
·
·
·
else
·
t=x>0?2:3;
·
·
·
·
·
·
·
·
}else
·
{
·
·
·
·
·
·
·
·
·
·
·
·
if(x*y>0)
·
t=x>0
·
?
·
4:5;
·
·
·
·
·
·
·
·
·
·
·
·
else
·
t=x>0
·
?
·
6:7;
·
·
·
·
·
·
·
·
}
·
·
·
·
}
}pt[MXN];
int·
n;
int·
main(){
·
·
·
·
scanf("%d",&n);
·
·
·
·
for(int
·
i=1;i<=n;++i){
·
·
·
·
·
·
·
·
scanf("%lld%lld%d",&pt[i].x,&pt[i].y,&pt[i].p);
·
·
·
·
·
·
·
·
pt[i].init();
·
·
·
·
}
·
·
·
·
sort(pt+1,pt+1+n);
·
·
·
·
int
·
cnt=1,val=pt[1].p;
·
·
·
·
for(int
·
i=2;i<=n;++i){
·
·
·
·
·
·
·
·
if(pt[i-1].line(pt[i])){
·
·
·
·
·
·
·
·
·
·
·
·
if(pt[i].p>1)++cnt,val+=pt[i].p;
·
·
·
·
·
·
·
·
·
·
·
·
else
·
if(pt[i-1].p>1)++val,++cnt;
·
·
·
·
·
·
·
·
·
·
·
·
else
·
++val;
·
·
·
·
·
·
·
·
}
·
·
·
·
·
·
·
·
else
·
·
·
·
·
·
·
·
·
·
·
·
++cnt,val+=pt[i].p;
·
·
·
·
}
·
·
·
·
printf("%d
·
%d\n",val,cnt);
·
·
·
·
return
·
0;
}
测试用例