// soluition 1,自己写的STL写法 #include<iostream> #include<algorithm> usingnamespacestd; constint N = 100010; int num[N]; intmain(){ int n,q,k,i; cin >> n >> q; for (i=0;i<n;i++) cin >> num[i];
while (q--){ cin >> k; int l = lower_bound(num, num +i, k)-num; int r = upper_bound(num, num +i, k)-num; //特判一下,l==r时说明上下界重合,未找到 if (l==r) cout << -1 << " " << -1 << endl; elsecout << l << " " << r-1 << endl;
// y总题解,更快一点 #include<iostream> #include<cstdio> #include<cstring> usingnamespacestd; constint N = 100010;
int n,m; int q[N]; intmain(){ scanf("%d%d",&n,&m); for(int i = 0;i < n;i++) scanf("%d",&q[i]);
for (int i = 0;i < m;i++){ int x; scanf("%d",&x); // 求二分左端点 int l = 0,r = n-1;// 确定区间范围 while (l < r){ int mid = l+r >> 1; if (q[mid]>=x) r = mid; else l = mid+1; }
if (q[r] == x){ printf("%d ",r); // 求二分x的右端点 r = n-1;// 右端点一定在[左端点, n - 1] 之间 while (l < r){ // 因为写的是l = mid,所以需要补上1 int mid = l+r+1 >> 1; if (q[mid]<=x) l = mid; else r = mid-1; } printf("%d\n",r); } elseputs("-1 -1"); } return0; }
1.3 实数二分
实数二分比整数二分简单多了。
注意:这里的二分除法是严格的除法,不是整数除法。
1.4 acwing.790.数的三次方根
1 2 3 4 5 6 7 8 9 10 11 12 13 14
给定一个浮点数 n,求它的三次方根。 输入格式 共一行,包含一个浮点数 n。
输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。
数据范围 −10000≤n≤10000 输入样例: 1000.00 输出样例: 10.000000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include<iostream> #include<cstdio> usingnamespacestd; intmain(){ double n; cin >> n; double l = -10000,r = 10000; while (r-l>1e-8){ // 比题目要求多求几位 double mid = (l+r)/2; if (mid*mid*mid>=n) r = mid; else l = mid; } printf("%lf",r); // 默认输出6位小数 return0; }