#include<bits/stdc++.h> using namespace std; int n, k, a[300005]; int low, high, cnt, m,x; string s; int main() { cin >>n; //a = 12,4,67,23,90,6,7,11,12 cin >> s; s = s+','; for ( int i=0; i<s.length(); i++){ if (s[i]!=',') _______(1)________; //填空1 else { a[++n] = x; x = 0; } } cin >> k; low=a[1] ; high=a[n]; for (int i=1; i<=n; i++) { if ( a[i] < low ) low = a[i]; if ( a[i]> high ) high = a[i]; } while (low < high) { m=(low+high) / 2; cnt = 0; for (int i=1; i<=n; i++) if (a[i] > m ) cnt += 1; if (cnt >= k) _____(2)______ ; //填空2 else ______(3)_____ ; //填空3 } cout << high; }
时间: 2024-04-17 12:25:02 浏览: 58
万能头文件#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std;
在填空处的代码如下:
填空1:可以使用以下来将字符串转换为整数:
```
x = x * 10 + (s[i] - '0');
```
填空2:当cnt >= k时,表示第k大的元素在m的右侧或者就是m本身,所以更新high为m:
```
high = m;
```
填空3:当cnt < k时,表示第k大的元素在m的左侧,所以更新low为m+1:
```
low = m + 1;
```
完整代码如下:
```cpp
#include<bits/stdc++.h>
using namespace std;
int n, k, a[300005];
int low, high, cnt, m,x;
string s;
int main() {
cin >>n;
cin >> s;
s = s+',';
for ( int i=0; i<s.length(); i++){
if (s[i]!=',')
x = x * 10 + (s[i] - '0');
else {
a[++n] = x;
x = 0;
}
}
cin >> k;
low=a[1] ;
high=a[n];
for (int i=1; i<=n; i++) {
if ( a[i] < low ) low = a[i];
if ( a[i]> high ) high = a[i];
}
while (low < high) {
m=(low+high) / 2;
cnt = 0;
for (int i=1; i<=n; i++)
if (a[i] > m ) cnt += 1;
if (cnt >= k)
high = m;
else
low = m + 1;
}
cout << high;
}
```
这段代码使用二分查找的思想来找到第k大的元素。首先读取输入的n和字符串s,然后将字符串s按逗号分隔为整数数组a。
接下来,初始化low为a中最小的元素,high为a中最大的元素。然后开始进行二分查找,直到low和high相等。每次将中点m设置为low和high的平均值,并遍历数组a统计大于m的元素个数cnt。
如果cnt大于等于k,说明第k大的元素在m的右侧或者就是m本身,所以更新high为m。否则,第k大的元素在m的左侧,所以更新low为m+1。
最后输出high即为第k大的元素。
请注意,这段代码是针对给定输入格式和范围进行实现的。在实际应用中,你可能需要添加输入验证和错误处理等其他逻辑。
阅读全文