新手编程求助

gregory316 2019-11-06 11:57:49
我是C++初学者,最近困扰了我很久,哪位大神能帮我解决这个编程问题,不胜感谢!

一个n*n的矩阵,开始所有位置的值都为0。有k次操作,每次操作用3个数x,y,v表示,表示将第x行y列的数值加上v。求最后前a行和前b行相交的子矩阵中数值之和

【输入格式】
输入文件matrix.in
第1行2个正整数n,k
后面k行每行3个正整数x,y,v,表示一次操作
后面1行2个正整数a,b

[输出格式]
输出文件matrix.out
一个整数,表示方案数

【输入输出样例1】
matrix.in

3 4
1 1 1
2 2 3
3 1 2
1 1 2
2 2

输入输出样例1说明
4次操作后,矩阵为
3 0 0
0 3 0
2 0 0
前2行2列组成的子矩阵之和为3+0+3+0=6.

数据规模与约定
20%的数据, n<=5, k<=20, v<=1000
50%的数据, n<=1000, k<=10000, v<=10000000
100%的数据, n<=20000, k<=10000, v<=10000000, 1<=x, y<=n, 1<=a, b<=n
...全文
52 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gregory316 2019-11-21
  • 打赏
  • 举报
回复
太感谢啦!!!
Italink 2019-11-06
  • 打赏
  • 举报
回复

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_K = 10000;
struct Point {
	int x, y;
	long long v = 0;
}matrix[MAX_K];	//定义稀疏矩阵
int len = 0;	//稀疏矩阵元素个数
void insert(const int& x, const int& y, const long long& v) {
	for (int j = 0; j < len; j++) {
		if (matrix[j].x == x && matrix[j].y == y) {	
			matrix[j].v += v;	//如果是之前已经录入过的坐标:+v
			return;
		}
	}
	matrix[len++] = { x,y,v };	//创建新坐标
}
long long getSum(const int& row, const int& col) {
	long long sum = 0;
	for (int i = 0; i < len; i++) {
		if (matrix[i].x <= row && matrix[i].y <= col)
			sum += matrix[i].v;
	}
	return sum;
}
int main() {
	int n, k, a, b, x, y;
	long long v;
	cin >> n >> k;
	for (int i = 0; i < k; i++) {
		cin >> x >> y >> v;
		insert(x, y, v);	
	}
	cin >> a >> b;
	cout << getSum(a, b);
	return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧