代码正确运行并且它完成了它应该做的事情,但我被告知我可以通过使用布尔表达式来加快速度,但不知道在哪里插入它们。问题是:
给定一个带有坐标的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;
}
答案 0 :(得分:1)
首先,你不必要地两次(在某些情况下)调用remote
。
考虑使用这个:
#include <algorithm>
z = std::max(z, remote(x, y));
这也将缩短和澄清代码。
此外,分歧可能很慢。尝试(在分析之后!)替换
x > a / 2 || y > a / 2
通过
(x << 1) > a || (y << 1) > a
注意 @Donnie&amp;其他人在评论中声称编译器将进行后一种优化,并且它们可能是正确的。
答案 1 :(得分:1)
我想告诉你我机器上的时间:
版本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);
在我的机器上,我降到了20ms。
答案 2 :(得分:0)
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)瓶颈现在在输入语句中。通过优化循环的其余部分获得的任何增益都会被输入时间所浪费。没有更多的投资回报可以进一步改变。