2023年CSP-S1阅读程序题3:
01 #include <vector> 02 #include <algorithm> 03 #include <iostream> 04 05 using namespace std; 06 07 bool fo(vector<int>& a, int m, int k){ 08 int s =0; 09 for(int i =0,j =0; i<a.size(); i++){ 10 while (a[i]- a[j]>m)j++; 11 s += i -j; 12 } 13 return s >= k; 14} 15 16 int f(vector<int>& a, int k){ 17 sort(a.begin(), a.end());1 8 19 int g =0; 20 int h = a.back()- a[0]; 21 while(g< h){ 22 int m = g+(h -g)/ 2; 23 if(fo(a,m, k)){ 24 h = m; 25 } else { 26 g = m+1;27 }28 }29 30 return g;31}32 33 int main(){34 int n,k;35 cin >> n >> k;36 vector<int> a(n,0);37 for(int i =o; i<n; i++){ 38 cin >> a[i]; 39 } 40 cout<< f(a,k)<< endl; 41 return 0 42}
假设输入总是合法的且|a[i]l≤108、n≤10000和1≤k≤n(n-1)/2,完成下面的判断题和单选题:
将第24行的“m”改为“m-1”,输出有可能不变,而剩下情况为少1。( )
将第22行的“g+(h-g)/2”改为“(h+g)>>1”,输出不变。( )
当输入为“572-451-3”,输出为“5”。( )
设a数组中最大值减最小值加1为A,则f函数的时间复杂度为( )。
0(n logA)
0(n²logA)
0(n log(nA))
0(n log n)
将第10行中的“>”替换为“>=”,那么原输出与现输出的大小关系为( )。
一定小于
一定小于等于且不一定小于
一定大于等于且不一定大于
以上三种情况都不对
当输入为“582-538-12”时,输出为( )。
“13”
“14”
“8”
“15”