学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴和朋友正在玩一个游戏,初始时,在一个 n×m 的棋盘上放置着 n×m 个棋子,每枚棋子都有一定的价值,第 i(1≤i≤n) 行第 j(1≤j≤m) 列的棋子的价值为 vi,j。
该游戏的规则为:在棋盘中任意选取两个正方形区域(第 k(1≤k≤2) 个正方形的左上角格子在第 xk 行第 yk 列,边长为 lenk),要求双方玩家使用最短的时间计算出这两个正方形区域中的总价值,谁先计算出正确结果,本局游戏就是谁获胜。
现在小猴想要知道,在他制定的规则下,游戏一共进行 q 局,每局游戏的正确结果是多少,以便于用来核对双方玩家计算出的结果是否正确。
【输入】
第一行,包含两个整数 n,m。
接下来 n 行,每行包含 m 个整数 vi,1,vi,2,…,vi,m。
接下来一行,包含一个整数 q。
接下来 q 行,每行包含 6 个整数 x1,y1,len1,x2,y2,len2。
【输出】
共 t 行,每行一个整数,表示答案。
【输入样例】
2 2
1 2
3 4
3
1 1 1 2 2 1
1 2 1 2 1 1
2 1 1 2 2 1
【输出样例】
5
5
7
【代码详解】
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 810, M = 810;
int n, m, q;
LL s[N][M];
int main()
{
cin >> n >> m;
for (int i=1; i<=n; i++) {
for (int j=1; j<=m; j++) {
cin >> s[i][j];
s[i][j] += s[i][j-1];
}
}
cin >> q;
while (q--)
{
int x1, y1, len1, x2, y2, len2;
cin >> x1 >> y1 >> len1 >> x2 >> y2 >> len2;
int x3 = x1 + len1 - 1, y3 = y1 + len1 - 1;
int x4 = x2 + len2 - 1, y4 = y2 + len2 - 1;
LL res = 0;
for (int i=x1; i<=x3; i++) {
res += s[i][y3] - s[i][y1-1];
}
for (int i=x2; i<=x4; i++) {
res += s[i][y4] - s[i][y2-1];
}
if (!(x3<x2 || x4<x1 || y3<y2 || y4<y1)) {
int x[] = {x1, x2, x3, x4};
int y[] = {y1, y2, y3, y4};
sort(x, x+4);
sort(y, y+4);
for (int i=x[1]; i<=x[2]; i++) {
res -= s[i][y[2]] - s[i][y[1]-1];
}
}
cout << res << endl;
}
return 0;
}
【运行结果】
3 4
1 2 3 4
-1 -2 -3 -4
6 7 -6 -7
3
1 1 2 2 3 2
-20
1 1 3 2 2 1
7
1 1 2 2 2 2
-2