我们在下面的文章中讨论了一些技巧。在这篇文章中,将讨论更多技巧。
在竞争性编程中高效地编写C / C++代码
尽管实践是确保在编程竞赛中提高性能的唯一方法,但是掌握一些技巧可以确保较高的优势和快速的调试。
1)在不使用%运算符的情况下检查数字是偶数还是奇数:
尽管此技巧并不比使用%运算符好多少,但有时还是有效的(使用大量数字)。使用和运算符:
if (num & 1)
cout << "ODD";
else
cout << "EVEN";
例子:
num = 5
二进制:“ 101&1”将是001,因此为true
num = 4
二进制:“ 100&1”将是000,因此为false。
2)快速乘法或除以2
乘以2表示将所有位向左移动,而除以2则表示向右移动。
示例:2(二进制10):向左移动4(二进制100),向右移动1(二进制1)
n = n << 1; // Multiply n with 2
n = n >> 1; // Divide n by 2
3)使用XOR交换2个数字:
此方法快速,不需要使用3rd变量。
// A quick way to swap a and b
a ^= b;
b ^= a;
a ^= b;
4)避免使用strlen():
// Use of strlen() can be avoided by:
for (i=0; s[i]; i++)
{
}
// loop breaks when the character array ends.
5)emplace_back()的使用(在这里,这里和这里讨论)
代替STL中的push_back(),可以使用emplace_back,因为它速度更快,而不是在其他地方分配内存,然后附加它直接在容器中分配内存。
6)内置的GCD函数: C++具有内置的GCD函数,无需显式编码。语法:__gcd(x,y);
7)使用内联函数:我们可以创建内联函数并使用它们,而不必在比赛中进行编码。示例:(a)用于筛子的函数,(b)用于回文法的函数。
8)数组的最大大小:我们必须知道在主函数声明的数组的最大大小为10 ^ 6左右,但是如果全局声明数组,则可以声明其最大大小为10 ^ 7。
9)计算最高有效位数:要计算任何数字的最高有效位数,可以直接使用log进行计算。
Suppose the number is N then
Let double K = log10(N);
now K = K - floor(K);
int X = pow(10, K);
X will be the most significant digit.
10)直接计算数字位数:要计算数字中的位数,而不是循环,您可以有效地使用log:
Number of digits in N =floor(log10(N)) + 1;
11)用普通的除法技术来知道数字是否为2的幂的有效技巧,复杂度为O(logN),但可以使用O(v)来解决,其中v是数字的位数以二进制形式。
/* Function to check if x is power of 2*/
bool isPowerOfTwo (int x)
{
/* First x in the below expression is
for the case when x is 0 */
return x && (!(x&(x-1)));
}
12)C++ 11内置了以下算法:
// are all of the elements positive?
all_of(first, first+n, ispositive());
// is there at least one positive element?
any_of(first, first+n, ispositive());
// are none of the elements positive?
none_of(first, first+n, ispositive());
有关详细信息,请参考C++ STL中的数组算法(all_of,any_of,none_of,copy_n和itoa)。
13)复制算法:用于将元素从一个容器复制到另一个容器。
int source[5] = {0, 12, 34, 50, 80};
int target[5];
// copy 5 elements from source to target
copy_n(source, 5, target);
有关详细信息,请参考C++ STL中的数组算法(all_of,any_of,none_of,copy_n和itoa)。
14)Iota算法算法iota()创建一系列按顺序递增的值,就像通过先给**分配初始值,然后使用前缀++递增该值一样。在下面的清单中,iota()将连续值{10,11,12,13,14}分配给数组arr,并将{‘a’,’b’,’c’}分配给char数组c []。
int a[5] = {0};
char c[3] = {0};
// changes a to {10, 11, 12, 13, 14}
iota(a, a+5, 10);
iota(c, c+3, 'a'); // {'a', 'b', 'c'}
有关详细信息,请参考C++ STL中的数组算法(all_of,any_of,none_of,copy_n和itoa)。
15)二进制形式的初始化:在C++ 11中,也可以二进制形式进行赋值。
// C++ code to demonstrate working of
// "binary" numbers
#include
using namespace std;
int main()
{
auto number = 0b011;
cout << number;
return 0;
}
输出 :
3
16)“和”的使用尽管技巧不是很有效,但该技巧可帮助您仅使用条件运算符,而不必键入&。
// C++ code to demonstrate working of "and"
#include
using namespace std;
int main()
{
int a = 10;
if (a < 20 and a > 5)
cout << "Yes";
return 0;
}
输出 :
Yes