青藤 最值、求和、计数 枚举巩固 1+2
程序员文章站
2022-06-17 18:42:32
青藤 最值、求和、计数 枚举巩固 1+2第一题 一维前缀和**题目大意:**给你n个数,q次询问区间[l,r]的数的总和。**分析:**要先做好预处理,到算的时候就只要减去之前的和就行了。代码#include using namespace std;int a, n, m;int s[100005];int main() { cin >> n >> m; for (int i = 1; i <= n;...
青藤 最值、求和、计数 枚举巩固 1+2
第一题 一维前缀和
**题目大意:**给你n个数,q次询问区间[l,r]的数的总和。
**分析:**要先做好预处理,到算的时候就只要减去之前的和就行了。
代码
#include <bits/stdc++.h>
using namespace std;
int a, n, m;
int s[100005];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a;
s[i] = s[i - 1] + a;
}
while (m--) {
int l, r;
cin >> l >> r;
cout << s[r] - s[l - 1] << endl;
}
return 0;
}
第二题 二维前缀和
**题目大意:**给出一n行m列的矩阵,q次询问左上角为(x1,y1) ,右下角为(x2,y2)的子矩阵中数的和
**分析:**要先做好预处理,到算的时候就只要其他子矩阵的和加上重复的子矩阵就行了。
代码
#include<bits/stdc++.h>
using namespace std;
int a[10003][10003],s[10003][10003];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,q;
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
for(int i=1;i<=q;i++)
{
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
printf("%d\n",s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);
}
return 0;
}
第三题 小鱼的航程
题目大意: 一只鱼一天行250km,周末休息,告诉你从星期x开始,游了n天,求总共游了几km。
**分析:**要一周一周算,按日算会超时。
代码
#include <bits/stdc++.h>
using namespace std;
long long x, x2, n, t, i, t2;
int main() {
scanf("%lld%lld", &x, &n);
for (i = 1; i <= 7; i++) {
if (x == 8)
x = 1;
if (x < 6)
t++;
x++;
}
t2 = n / 7 * t;
t = 0;
for (i = 1; i <= n % 7; i++) {
if (x == 8)
x = 1;
if (x < 6)
t++;
x++;
}
cout << (t2 + t) * 250;
return 0;
}
第四题 楼层编号
题目大意: 小林住在m层,给你一个高能数字t,如果存在高能数字那么该楼层就不存在,让你求小林真实的楼层。
分析: 只要枚举每一天,是否存在高能数字就行了。然后再天数减去记录的数量。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,t,sum=0,k,ni;
cin>>n>>t;
for(int i=1;i<=n;i++)
{
ni=i;
while(ni!=0)
{
if(ni%10==t)
{
sum++;
break;
}
ni/=10;
}
}
cout<<n-sum<<endl;
return 0;
}
本文地址:https://blog.csdn.net/coollend/article/details/111052772