芬兰木棋(Mölkky,又称芬兰木柱)是源自芬兰的一项运动。哲哲将这个运动改造成了赛博朋克单人版,现在场上一开始有 N 根立起的小木棋(上面分别标有一个非负整数),哲哲投掷一根大木棋去击倒这些小木棋以获得分数。分数规则如下:

  • 如果仅击倒 1 根木棋,则得木棋上的分数。
  • 如果击倒 2 根或以上的木棋,则只得击倒根数的分数。(例如击倒 5 根,则得 5 分。)

哲哲固定站在 (0,0) 点上,四周放着若干个小木棋 (Xi​,Yi​),坐标均为整数。每次哲哲可以朝一个方向扔出大木棋,大木棋会打倒这个方向上离哲哲最近的 k 个小木棋。哲哲游戏水平很高超,所以这个 k 可以自由控制。

请问哲哲最多能拿多少分,在获得最多分数的情况下最少需要扔出多少次大木棋?

规则与真实规则有较大出入,真实游玩时请以国际莫尔基组织的规则为准

输入格式:

输入第一行是一个正整数 N (1 ≤ N ≤ 10^5),表示场上一开始有 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

题意: 哲哲站在(0, 0)点,同时有n个木柱,它们的坐标分别为(xi, yi),每个木柱有一个分数pi,如果一次击倒一个木柱那就可以获得该柱子上的分数,如果一次击倒多个就获得击倒木柱个数的分数,每次可以击倒一个方向上的若干柱子,求哲哲获得的最大分数以及获得该分数的最小操作次数。

分析: 显然最大分数就是各柱子分数和,为了获得最大的分数,对于任何一个分数大于1的柱子,必须通过1次操作击倒,而对于一个方向上的连续的分数为1的柱子,也必须1次击倒它们,否则会浪费次数,所以最终答案就是同一方向上连续的分数为1的段数+分数大于1的柱子数。

具体实现可以利用gcd,设gcd为x[i]和y[i]的最大公约数的绝对值,对于每个点都可以令x[i] /= gcd,y[i] /= gcd,这样同一射线上的点最终会聚在一起,而它们的gcd[i]就表征了它们距离(0, 0)的远近,对于每条射线都可以用一个pair来表示,通过map把不同的pair映射到int上,这样就可以用vector数组来存储每条射线上的所有点了,对于每条射线分别按照它们的gcd排序,然后遍历每条射线,统计答案即可。

具体代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <map>
#include <vector>
#define int long long
#define pii pair<int, int>
using namespace std;struct node{int x, y, p, gcd;
}a[1000005];
map<pii, int> mp;
vector<int> P[1000005];
int cnt;bool cmp(int c, int d){return a[c].gcd < a[d].gcd;
}signed main()
{int n;cin >> n;int score = 0;for(int i = 1; i <= n; i++){scanf("%lld%lld%lld", &a[i].x, &a[i].y, &a[i].p);a[i].gcd = abs(__gcd(a[i].x, a[i].y));a[i].x /= a[i].gcd;a[i].y /= a[i].gcd;score += a[i].p;if(mp[make_pair(a[i].x, a[i].y)] == 0) mp[make_pair(a[i].x, a[i].y)] = ++cnt;P[mp[make_pair(a[i].x, a[i].y)]].push_back(i);}for(int i = 1; i <= cnt; i++)sort(P[i].begin(), P[i].end(), cmp);int times = 0;for(int i = 1; i <= cnt; i++){int t = 0;bool start = false;//连续1的区间是否开始 for(int j = 0; j < P[i].size(); j++){int id = P[i][j];if(a[id].p != 1){start = false;t++;}else{if(!start){start = true;t++;}}}times += t;}printf("%lld %lld\n", score, times);return 0;
}

[stl]芬兰木棋 2021RoboCom初赛B相关推荐

  1. 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)7-2 芬兰木棋 (25 分)

    芬兰木棋(Mölkky,又称芬兰木柱)是源自芬兰的一项运动.哲哲将这个运动改造成了赛博朋克单人版,现在场上一开始有 N 根立起的小木棋(上面分别标有一个非负整数),哲哲投掷一根大木棋去击倒这些小木棋以 ...

  2. 7-2 芬兰木棋 结构体排序

    7-2 芬兰木棋 分数 25 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 WX20200212-152528.png 芬兰木棋(Mölkky,又称芬兰木柱)是源自芬兰的一项运动.哲哲 ...

  3. 芬兰木棋 (25 分)

    robocom初赛B题 //32位整数-2147483628~2147483647 //绝对值后就超过int范围 #include <cstdio> #include <iostre ...

  4. 「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess

    「Luogu4363/BZOJ5248」[九省联考2018]一双木棋chess 学校省选模拟居然拿九省联考来考 然而我还是\(too\space young\),搞不懂什么叫最优 让二者的答案最接近可 ...

  5. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  6. bzoj5248 [2018多省省队联测]一双木棋

    5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 155  Solved: 132 [Submit][St ...

  7. 「九省联考 2018」一双木棋

    「九省联考 2018」一双木棋 题目描述 菲菲和牛牛在一块 \(n\) 行 \(m\) 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满 ...

  8. JZOJ 5637. 【NOI2018模拟4.8】一双木棋

    Description 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结 束.落子的规则是:一个格子可 ...

  9. bzoj 5248: [2018多省省队联测]一双木棋

    Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...

最新文章

  1. lucene 索引流程整理笔记
  2. oracle ssl发送邮件,使用javax.mail发送带有ssl的电子邮件
  3. [BZOJ] 2064: 分裂
  4. c语言中for语句的作用是,c语言中for语句是怎么用的
  5. android 获取编译日期,flutter学习笔记(2)android编译,以及如何加快首次编译时间。...
  6. c语言定义int 输出4386,大学C语言第五章课后习题参考程序
  7. java 解析ppt动画_上映17天,姜子牙口碑一路狂跌,但这份PPT让它又火了!
  8. python 全部缩进一行_Python成为专业人士笔记–程序行空白及tab缩进的作用
  9. 庞果网一道题(字符博弈)的一点想法
  10. mysql英文怎么发音_英文字母和汉语拼音先学哪个?科学答案在这里
  11. Javashop连锁门店系统帮助企业快速搭建自己企业商城
  12. 一步步破解app协议第二步(审计代码)
  13. VS2010 无法打开包括文件:“cv.h”
  14. 基于SSM实现的儿童疫苗信息管理系统设计与实现 毕业设计-附源码311930
  15. xcode8插件管理工具
  16. 安装小企鹅游戏(企5)
  17. k8s的Scheduler 原理(预选策略、优选策略)
  18. 根据原厂uboot进行移植
  19. 网络 | 1.OSI七层模型各层常见协议
  20. 解决路由报错Uncaught (in promise) NavigationDuplicated:

热门文章

  1. 【PPT教程】常用快捷键
  2. 单片机c语言程序流程图,ds1302时钟程序详解,ds1302程序流程图(C程序)
  3. 十余年软装配饰设计和艺术品定制经验的软装设计机构
  4. i5-8300H+Nvidia1060安装win+ubuntu16.04双系统记录
  5. JavaScript中的事件传播(DOM2标准事件模型)
  6. ubuntu Samba 匿名用户访问
  7. 第二章:图像合成技能
  8. A - Bookshelf Filling (非二分法,好像还更快)
  9. 事业环境因素和组织过程资产区别
  10. 微信小程序 音乐播放代码(播放方式,歌词滚动)