C++ 信息学奥赛拔高题例题 1 (含题目,代码,知识点讲解)
文章目录
- 题目要求
- 思路
- 代码
- 代码知识点重点 (不懂看我)
- 1 sort
- 2 取模
题目要求
有n件礼物藏在房间里,第 i 件礼物在二维平面的 (xi,yi) 这个点上,小明刚开始在原点 (0,0) ,他很笨,每次只会关注还没拿到的 x 最小的礼物,如果有多个,他会看 y 最小的,然后从当前位置沿直线走到那个礼物的位置停在那里拿走礼物,然后再去找下一个要拿的礼物。小明每一次从目前所在的点走到要拿的礼物的点需要消耗的体力为两点距离的平方。
小明想知道如果按照这样的方法拿完所有礼物的话,一共要消耗多少体力,由于答案可能过大,你只需要输出这个结果对 (10的九次方)10^9+7 取模后的结果就可以了。
输入
第一行,一个正整数 n(1≤n≤105)。
接下来 n 行,每行两个正整数 xi,yi(1≤xi,yi≤109)。
2
1 2
3 4
输出
输出一行,包含一个整数,表示蒜头君消耗的体力对 (10的九次方)10^9+7 取模后的结果。
13
思路
使用结构体储存每一个礼物坐标的x,y值,再利用取模的性质获取答案并输出
(注意,不能直接拿每次拿礼物时两点距离的平方直接加在一起取模,数据太大,long long int 类型存不下)
代码
#include<iostream>
#include<algorithm>
using namespace std;
struct point//定义结构体
{int x;//x坐标int y;//y坐标
};
point a[100000];int p(point a,point b)
//algorithm 库里的函数sort允许自定义排序规则函数,要比自己写排序函数省时间的多
{if(a.x!=b.x) return a.x<b.x;//返回true or falseelse return a.y<b.y;//返回true or false
}int main()
{long long int i,sum=0,m=1000000007;//定义变量,m储存10的九次方+7,方便使用long long int n,x,y;//定义变量cin>>n;for(i=1;i<=n;i++){scanf("%d %d",&a[i].x,&a[i].y);//输入数据}sort(a+1,a+1+n,p);//使用algorithm 下的 sort 函数进行排序a[0].x=0;a[0].y=0;//初始化 原点 (0,0)for(i=1;i<=n;i++){x=a[i].x-a[i-1].x;y=a[i].y-a[i-1].y;//分别获取两点距离sum+=(x*x)%m+(y*y)%m;//取模sum%=m;//取模}cout<<sum<<endl;//输出
}
代码知识点重点 (不懂看我)
1 sort
int p(point a,point b)
//algorithm 库里的函数sort允许自定义排序规则函数,要比自己写排序函数省时间的多
{if(a.x!=b.x) return a.x<b.x;//返回true or falseelse return a.y<b.y;//返回true or false
}sort(a+1,a+1+n,p);
sort 允许自定义排序规则
在排序时向自定义的函数传递两个数据,
比如:
在示例代码中,如果a.x<b.x,那么在数组里a 就会排在b 前面,< 本身就是一种函数,返回布尔值
2 取模
大家对于这一段可能有些疑惑,到底啥意思呢?
for(i=1;i<=n;i++){x=a[i].x-a[i-1].x;y=a[i].y-a[i-1].y;//分别获取两点距离sum+=(x*x)%m+(y*y)%m;//取模sum%=m;//取模}
其实是基于一个取模的性质,用公式表示为
(a+b)%m = (a%m+b%m)%m
公式的证明方式有点复杂,不具体说了,大家记住就好。
它甚至还有兄弟
(a+b)%m = (a%m+b%m)%m
(a-b)%m = (a%m-b%m)%m
(a*b)%m = (a%m*b%m)%m
以上就是本文章所有内容,如果有写的不清楚的地方,请留步评论区~~
如果本文有帮助到你进步,请留下一个赞。你的赞是对我最大的鼓励! | |
---|---|
信息学奥赛拔高题例题,我会在接下来的日子里坚持更新哒~~ |
C++ 信息学奥赛拔高题例题 1 (含题目,代码,知识点讲解)相关推荐
- 信息学奥赛真题解析(玩具谜题)
玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...
- 信息学奥赛真题解析(笨鸟)
2020年全国信息学线上测试活动_普及组_T4 笨鸟 [题目描述] 小王特别喜欢玩flappy birds,但是他比较菜,所以向大家寻求帮助,游戏规则大家都懂,横坐标+1时,点一下屏幕,纵坐标+1 ...
- 信息学奥赛一本通(1090:含k个3的数)
1090:含k个3的数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 42180 通过数: 23333 [题目描述] 输入两个正整数m和k,其中1< ...
- 信息学奥赛真题解析(美国信息学回文数)
美国信息学奥林匹克竞赛题目(回文数) 每年NOI,NOIP(或CSP)都会参考美国的题目. 题目描述 题目原文: Palindromes are numbers that read the same ...
- 信息学奥赛一本通题库1005 地球人口承载力估计
[题目描述] 假设地球上的新生资源按恒定速度增长.照此测算,地球上现有资源加上新生资源可供x亿人生活a年,或供y亿人生活b年. 为了能够实现可持续发展,避免资源枯竭,地球最多能够养活多少亿人? [输入 ...
- 信息学奥赛一本通题库1004 字符三角形
[题目描述] 给定一个字符,用它构造一个底边长5个字符,高3个字符的等腰字符三角形. [输入] 输入只有一行,包含一个字符. [输出] 该字符构成的等腰三角形,底边长5个字符,高3个字符. [输入样例 ...
- 信息学奥赛真题解析(小凯的疑惑)
[NOIP 2017 提高组 DAY1 T1]小凯的疑惑 [题目] 题目描述: 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物 ...
- 信息学奥赛一本通题库1000 入门测试题目
[题目描述] 求两个整数的和. [输入] 一行,两个用空格隔开的整数. [输出] 两个整数的和. [输入样例] 2 3 [输出样例] 5 [题目思路] 无 [参考代码] #include<bit ...
- 信息学奥赛一本通 1000:入门测试题目
目录 代码呈上: 题目要求: 代码解析: 代码呈上: #include<iostream> using namespace std; int main(){int a, b, c;cin& ...
最新文章
- 数据竞争(data race)问题分析的利器——valgrind的Helgrind
- Java Cardioid 心脏形曲线 (整理)
- ACL 2021 | 北京大学KCL实验室:如何利用双语词典增强机器翻译?
- m40型工业机器人_工业机器人4大控制方式,你知道几种?
- RuntimeError: Failed to register operator torchvision::_new_empty_tensor_op. +torchtorchversion版本匹配
- 配置opencv cmake
- 3蛋白wb_WB常见问题原因分析及解决办法
- JAVA MyFirst.java
- JS function 函数基本定义方法
- 像Selenium爬网页一样爬手机App,可见即可爬——appium 教程(二)appium实战抓取手机知乎APP的热点标题
- TCP报文段中的序号和确认号
- kali2022安装AWVS
- Android发带附件和图片的邮件
- kali虚拟机无法发现外置网卡问题
- 网易游戏互娱 笔试题2021.8.7 Java版
- 新书字码的差不多了,想众包几个事情
- 配置IIS6出现 出现验证码无法显示问题
- 阿里面试题之洗衣机问题
- 没有美术基础如何学?月薪过万建模大佬的八字真言
- RedHat Linux9中vim升级方法及如何安装五笔输入法
热门文章
- 【卡尔曼滤波】卡尔曼滤波在雷达目标跟踪中的应用仿真matlab源码
- php redis 高并发队列,laravel+Redis简单实现队列通过压力测试的高并发处理
- LISP 冻结excel窗格_LISP实现EXCEL导入AUTOCAD表格中单元格值属性的修改-第一阶段
- 乱谈诸葛亮的团队建设
- 【转】前端验证码倒计时、后台发送验证码、创蓝短信接口
- 如何注册一个Windows服务
- 基于华为ensp的计算机网络实验(路由器配置 RIPv1 基本功能)
- 打通设计模式任督二脉 -- 单例模式
- 当我们在谈论AI工业化时,我们在谈论什么?
- FHS Linux目录详解