Acwing蓝桥杯
789.数的范围
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], t, m, n;
int check_lower(int ans) //找小于等于ans的第一个值
{
int l = 1, r = n;
while (l < r)
{
int mid = (l + r) >> 1;
if (a[mid] >= ans) //在这种情况下a[mid]>ans和a[mid]==ans的意义是一样的都是满足区间右端点移动
r = mid;
else
l = mid + 1;
}
if (a[l] != ans)
return -1;
return l - 1;
}
int check_greater(int ans) //找大于等于ans的第一个值
{
int l = 1, r = n;
while (l < r)
{
int mid = (1 + l + r) >> 1;
if (ans >= a[mid])
l = mid;
else
r = mid - 1;
}
if (a[l] != ans)
return -1;
return l - 1;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
while (m--)
{
cin >> t;
cout << check_lower(t) << " " << check_greater(t) << endl;
}
}
790.数的三次方根
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
double n;
double check_ans(double ans)
{
double l = -1000, r = 1000;
while (r - l > 1e-8)
{
double mid = (l + r) / 2.0;
if (mid * mid * mid > ans)
r = mid;
else
l = mid;
}
return l;
}
int main()
{
cin >> n;
printf("%.8f", check_ans(n));
}
795.前缀和
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, k, a[N], l, r;
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
a[i] += a[i - 1];
while (k--)
{
cin >> l >> r;
cout << a[r] - a[l - 1] << endl;
}
}
796.子矩阵的和
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int n, m, k, a[N][N], l, r, x, y;
int main()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
while (k--)
{
cin >> l >> r >> x >> y;
cout << a[x][y] - a[x][r - 1] - a[l - 1][y] + a[l - 1][r - 1] << endl;
}
}
730. 机器人跳跃问题
- 这里需要注意每次E都会增大一倍,如果没有上限,会导致爆longlong,因此需要发现每次操作实际上都是E = E * 2 - a[i];这样,所以如果E * 2 - a[i] >= max就可以保证之后的值都是满足条件的。
当然如果java或者python也可以很好的避免
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, a[N], ma;
int check(int E)
{
for (int i = 1; i <= n; i++)
{
if (E > ma)
return 1;
if (a[i] > E)
E -= (a[i] - E);
else
E += (E - a[i]);
if (E < 0)
return 0;
}
return 1;
}
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
ma = max(a[i], ma);
}
int l = 0, r = ma;
while (l < r)
{
int mid = l + r >> 1;
if (check(mid))
r = mid;
else
l = mid + 1;
}
cout << l;
}