UVA - 10895Matrix Transpose(vector)

题目:UVA - 10895Matrix Transpose(vector)

题目大意:给出一个矩阵求它的转置矩阵。

解题思路:因为数组可以达到10000 * 10000 然后里面非0的数最多1000,所以用vector数组来存储。

代码:

#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

const int N = 10005;
struct Mat {

	int th, val;
};

vector<Mat> v[N];
vector<Mat> ans;
vector<int> th, val;
int cnt[N];
int m, n;

void solve () {

	printf ("%d %d\n", n, m);

	memset (cnt, 0, sizeof (cnt));
	Mat tmp;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (v[j].size() && cnt[j] < v[j].size() && v[j][cnt[j]].th == i) {
				tmp.th = j;
				tmp.val = v[j][cnt[j]].val;
				ans.push_back(tmp);
				cnt[j]++;
			}
		}

		printf ("%d", ans.size());
		for (int j = 0; j < ans.size(); j++)
			printf (" %d", ans[j].th + 1);
		printf ("\n");

		if (ans.size()) {
			for (int j = 0; j < ans.size(); j++) {
				if (j != ans.size() - 1)
					printf ("%d ", ans[j].val);
				else
					printf ("%d\n", ans[j].val);
			}
		} else
			printf ("\n");
		ans.clear();
	}

	for (int i = 0; i < m; i++)
		v[i].clear();
}

int main () {

	int num, a;
	Mat tmp;
	while (scanf ("%d%d", &m, &n) != EOF) {

		for (int i = 0; i < m; i++) {

			scanf ("%d", &num);
			th.clear();
			val.clear();

			for (int j = 0; j < num; j++) {
				scanf ("%d", &a);
				th.push_back(a);
			}

			for (int j = 0; j < num; j++) {
				scanf ("%d", &a);
				val.push_back(a);
			}

			for (int j = 0; j < num; j++) {
				tmp.th = th[j] - 1;
				tmp.val = val[j];
				v[i].push_back(tmp);
			}
		}
		solve();
	}
	return 0;
}
时间: 2024-12-14 21:36:46

UVA - 10895Matrix Transpose(vector)的相关文章

[UVA 12589]Learning Vector[DP]

题目链接:[UVA 12589]Learning Vector[DP] 题意分析:给出n个矢量,从中选择k个,以坐标原点为起点,收尾相连,问:这样的k个周围相连矢量与x轴围成图形的最大面积的两倍是多少? 解题思路:考虑状态:dp[id][pick][h]代表到第id个矢量为止,选择pick个矢量离最大面积还差多少,h为当前图形最右端高度.具体转移看代码. 这里着重说一下为什么要对这些矢量按斜率进行排序: 首先,整个求解过程其实就是在暴力枚举这些向量的组合,只不过采用了记忆化搜索优化. 其次,对于

UVa 400 模拟vector

背景:多久没有一次ac过了,要提升一次ac的几率啊!这对比赛是很重要的. 思路:这个题主要是更加熟悉了下vector,然后就是一些格式的问题,构造即可.主要感受还是一定要把思路想好再写题! #include <set> #include <stack> #include <queue> #include <vector> #include <cstdio> #include <cstring> #include <cstdlib

UVA 230 Borrowers(vector和map的应用,模拟)

1 //#include<bits/stdc++.h> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<cstring> 6 #include<string> 7 #include<iostream> 8 using namespace std; 9 typedef long long ll; 10 /** 11 题意:SHELVE

UVa 12096 map ,vector,set,string ,stack的混用

背景:这个题对stl不熟悉根本无法自己作,只有照着理解书上的代码. 思路:用一个vector容器来储存集合,map中key为集合,value为该集合对应的vector容器的下标,并把下标称为ID,stack中储存的是ID每次对stack执行操作,实际是对stack中ID对应的集合执行操作用到了set_uinon和set_intersection. #include<iostream> #include<vector> #include<map> #include<

UVa 12589 Learning Vector

题意:有n个向量(0 <= x,y <= 50),选出其中的K个(n,k <= 50) 围成的面积最大为多少? 思路:先确定一点,对于选出的k个向量,按斜率从大到小的顺序摆放,面积最大.(不然会损失几个平行四边形的面积) 然后DP , DP[id][cur][height] 分别表示前id个向量,已经选出了cur个向量,高度为height的最大面积.面积计算公式为  x0*y0 + 2*x1*y0+x1*y1 + 2*x2*(y0+y1)........用记忆化搜索注意初始化的优化! #

LeetCode题解Transpose Matrix

1.题目描述 2.题目描述 直接申请内存,转置即可. 3.代码 1 vector<vector<int>> transpose(vector<vector<int>>& A) { 2 int C = A.size() ; 3 int R = A[0].size() ; 4 vector<vector<int>> result(R,vector<int>(C) ) ; 5 6 for( int i = 0 ; i &

leetcode 867. 转置矩阵(Transpose Matrix)

目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]] 示例 2: 输入:[[1,2,3],[4,5,6]] 输出:[[1,4],[2,5],[3,6]] 提示: 1 <= A.length <= 1000 1 <= A[0].length <

ACM-ICPC Dhaka Regional 2012 题解

B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每个地点经过的次数(维护一个栈就可以了,注意进入起点和离开起点都不算入起点的次数) #include<cstdio> #include<cstring> #include<stack> #include<iostream> #include<algorithm> using

lanczos算法及C++实现(二)实对称阵奇异值分解的QR算法

本文属作者原创,转载请注明出处: http://www.cnblogs.com/qxred/p/qralgorithm.html 首先推荐两个参考文献 https://www.math.kth.se/na/SF2524/matber15/qrmethod.pdf http://people.inf.ethz.ch/arbenz/ewp/Lnotes/chapter4.pdf 1. 基本的QR算法 我们先讨论一般对阵矩阵的QR算法,再讨论对称三对角阵的QR算法 给定一个实对称阵X,假设其特征值分解