如果要将两个for嵌套循环的值每个都相加,例如
for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) { k[i * n + j] = k[i] + k[j]; // cout << l * n + p << " "; } }
每个相加一遍,总共需要相加n的二次方次,如果要将值存入另外一个数组中,那么这个数组k的每个下标应该即为i*n+j,也就是0,1,2,...,n,这样就可以实现两个数组的相关操作有序的存到一个数组中。
STL中二分函数的使用
#include#include using namespace std; int main() { int n,m,k[50],temp[500]; cin >> n >> m; for(int i = 0;i < n;i++) cin >> k[i]; for(int l = 0;l < n;l++) { for(int p = 0;p < n;p++) { temp[l * n + p] = k[l] + k[p]; // cout << l * n + p << " "; } } sort(temp,temp + n * n); int flag = 0; for(int i = 0;i < n;i++) { for(int j = 0;j < n;j++) { if(binary_search(temp,temp + n * n,m - k[i] - k[j])) { flag = 1; } } } if(flag == 1) cout << "Yes" << endl; else cout << "No" << endl; return 0; }
在其他人的博客中看到的STL二分函数的一些总结,如下:
1. binary_search(arr[],arr[]+size , index)
二分查找,其中,arr[] 表示数组首地址,size表示元素个数,index则表示查找的元素,首要的一点是数组必须是有序的,并且一定是从小到大的,非递减的。可以看出 size 和sort 等函数的使用方法都是一样的,都是到最后元素的下一位
2. lower_bound(arr[],arr[]+size,index)
查找在范围内大于或等于index的数组元素中第一个元素的地址,相当于一个指针值
3.upper_bound(arr[],arr[]+size,index)
查找在范围内大于index的数组元素中第一个元素的地址,相当于一个指针值。暂时还没找到找出第一个小于index的数组元素的函数。