前缀和二分查找字串长度 , 求第一个大于 x 的平方数 ,求根号 x 的精确值(小数点后五位)
1.给定一个正整数序列,让你去一个字段,使得其区间的和大于等于x,问你这个字段最短可能长度是多少.
思路:
前缀和 遍历
固定一个左端点,右端点二分查找
找到最小值即可
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int map[1010] = { 0,1,2,4,7,9 };
int len = 5;
int x = 10;
int min = len + 1;
int sum[1010] = { 0 };
for (int i = 1; i <= len; i++) {
sum[i] = sum[i - 1] + map[i];
}
for (int i = 1; i <= len; i++) {
int l = i, r = len;
while (l < r) {
int mid = (l + r) / 2;
//cout << l << "'\t" << r << endl;
if (sum[mid] - sum[i - 1] > x) {
r = mid;
}
else if (sum[mid] - sum[i - 1] < x) {
l = mid + 1;
}
else {
l = mid;
break;
}
}
if (sum[l] - sum[i - 1] >= x) {
int s = l - i + 1;
min = s < min ? s : min;
}
}
cout << min << endl;
return 0;
}
2.给定一个数 x ,求解第一个大于x的平方数
思路:
循环查找,二分法判断一个数是不是平方数
代码:
int integer(int n) {//二分查找 根号n 的整数部分
int i, o, N = 1;
for (i = 1, o = n - 1; i <= o;) {
int mid = i + o >> 1;
if (i == o || i + 1 == o) {
N = i;
break;
}
if (mid * mid > n) {
o = mid;
} else if (mid * mid < n) {
i = mid;
} else {
N = mid;
break;
}
}
return N;
}
int square_max(int n) {
int N = 0;
for (int i = n + 1;; i++) {
N = integer(i);
if (N * N == i) {//判断一个数是不是平方数 是就直接退出循环直接返回
break;
}
}
return N*N;
}
3.给定一个数x,求解 根号 x 的精确值,误差小于 1e - 5 (精确到小数点后五位)
思路:
先用二分法求出整数部分,再循环找出小数部分
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
double n;
cin>>n;
double l=1,r=n;
for(int i=1;i<=5000;i++){
double mid=(l+r)/2;
if(mid*mid>n){
r=mid;
}else{
l=mid;
}
}
cout<<r;
return 0;
}