[英]Could someone please just tell me why my for() loop will not count all the way up?
[英]Could someone tell me any different way to make this code faster?
该代码可以正确运行,并且可以执行预期的操作,但是有人告诉我可以通过使用布尔表达式来提高它的速度,但是我真的不知道在哪里将其插入。 问题是:
给定一个由n个点组成的坐标序列,编写一个程序,该程序计算一个点的最小距离的值,该点位于正方形之外。 如果点既不在正方形内部,也不属于正方形轮廓,则该点位于正方形外部。 如果正方形外没有任何点,则程序必须输出0。
限制条件:
1≤n≤10000和1≤a≤1000;
例:输入:5 4
1 2
4 6
-3 2
-2 2
4 -1
输出:5
有人可以建议我一些提高代码效率的技术吗?
int remote(int x, int y) {
int z = abs(x) + abs(y);
return z;
}
int main() {
int n, a;
int x;
int y;
cin >> n >> a;
int z=20001;
for (int i = 1; i <= n; i++) {
cin >> x >> y;
if (x > a / 2 || y > a / 2) {
if (z > remote(x, y)) {
z = remote(x, y);
}
}
}
cout << z <<endl;
return 0;
}
例如,您不必要地拨打两次remote
电话(在某些情况下)。 考虑使用此:
#include <algorithm>
z = std::max(z, remote(x, y));
这还将缩短并阐明代码。
另外,划分可能很慢。 尝试(分析后!)替换
x > a / 2 || y > a / 2
通过
(x << 1) > a || (y << 1) > a
注意 @Donnie&others在注释中声称编译器将进行后一种优化,并且它们可能是正确的。
我想向您展示我的机器上的计时:
版本1:
for (int i = 1; i <= n; i++) {
cin >> x >> y;
if (x > a / 2 || y > a / 2) {
if (z > remote(x, y)) {
z = remote(x, y);
}
}
}
版本2:
for (int i = 1; i <= n; i++) {
cin >> x >> y;
/* if (x > a / 2 || y > a / 2) {
if (z > remote(x, y)) {
z = remote(x, y);
}
}
*/
}
对于n = 10 ^ 5,用-O3编译都产生60ms。 无需优化即可编译:均为60ms。
优化的第一步是知道程序在哪里花费时间。 读取/解析数据是瓶颈。
您可以通过在第一行中添加以下内容来加快速度:
ios_base::sync_with_stdio(false);
在我的机器上,我只有20毫秒。
1)为remote
功能分配一个临时值:
if (x > a / 2 || y > a / 2)
{
const int r = remote(x,y);
if (z > r)
{
z = r;
}
}
2)更换调用remote
用的内容remote
,去除函数调用的开销:
if (x > a / 2 || y > a / 2)
{
const int r = abs(x) + abs(y);
if (z > r)
{
z = r;
}
}
3)用常量临时变量替换a / 2
:
const int midpoint = a >> 1;
if (x > midpoint || y > midpoint)
4)将编译器优化级别更改为高-以提高速度。
5)瓶颈现在在输入语句中。 通过优化循环的其余部分获得的任何增益都会浪费输入时间。 没有更多的投资回报率可作进一步的改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.