l = lower_bound(c + 1, c + t + 1, a[i]) - c含义
时间: 2024-04-27 10:22:37 浏览: 75
这是一个 C++ 语言中的表达式,其中 lower_bound 函数是 STL 中的一个函数,用于在一个已排序的序列中查找第一个大于或等于指定值的元素位置。
具体地,l 表示一个指针,指向序列 c 中第一个大于或等于 a[i] 的元素位置。其中,c 是一个已排序的序列,t 是序列的长度,a[i] 是待查找的值。这里使用指针减法,得到的是该位置在序列中的下标位置。如果 a[i] 大于序列中的所有元素,则 l = t + 1。
相关问题
#include<algorithm> #include<iostream> using namespace std; const int N = 1e6; int arr[N]; int atr[N]; int k, c, n; int sum = 0; int main() { int t; cin >> t; while (t--) { cin >> k >> c >> n; for (int i = 1; i <= n; i++) { cin >> arr[i]; sum += arr[i]; } sort(arr + 1, arr + n + 1); int gg = c; while (k) { if (n == 0)break; int l = 1, r = n; while (l < r) { int mid = (l + r + 1) >> 1; if (arr[mid] < gg) { l = mid; } else { r = mid - 1; } } if (arr[l] <= gg) { gg -= arr[l]; int b[200]; int cnt = 1; // arr[l] = 0; for (int i = 1; i <= n; i++) if (i != l)b[cnt++] = arr[i]; n--; for (int i = 1; i <= n; i++)arr[i] = b[i]; sort(arr + 1, arr + 1 + n); } else if (k != 1) { gg = c; k--; } else { k--; } } if (n == 0)cout << "Let's go\n"; else cout << "find another way\n"; } return 0; }优化上述代码
抱歉,我刚才发的回答有误,是之前的代码。以下是对这段代码的优化建议:
1. 尽可能减少数组的复制和排序次数,可以使用指针代替数组下标进行操作,将排序操作放到外层循环中,只排序一次即可。
2. 二分查找可以使用STL中的lower_bound函数代替手写二分查找,可以减少代码量和提高效率。
3. 可以将输入和输出的操作放到循环外层,减少IO操作的次数。
4. 可以使用快读/快输优化输入输出效率。
以下是优化后的代码:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6;
int arr[N], atr[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin >> t;
while (t--)
{
int k, c, n;
cin >> k >> c >> n;
int sum = 0;
for (int i = 0; i < n; ++i)
{
cin >> arr[i];
sum += arr[i];
}
sort(arr, arr + n);
int gg = c;
bool success = true;
for (int i = 0; i < k; ++i)
{
auto iter = lower_bound(arr, arr + n, gg);
if (iter == arr + n)
{
success = false;
break;
}
gg += c - *iter;
}
if (success)
cout << "Let's go" << endl;
else
cout << "find another way" << endl;
}
return 0;
}
```
阅读全文