HDU 4920 居然会超时

题意:求两个n*n的矩阵相乘的结果,得出的每个元素%3;

分析:2000ms然后n的范围是800,我们自己估算的时间复杂度并不会超时,但是结果就是超时了。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <cstdlib>
 7 #include <string>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <queue>
12 #include <stack>
13 #include <algorithm>
14 using namespace std;
15 #define ll long long
16 #define _cle(m, a) memset(m, a, sizeof(m))
17 #define repu(i, a, b) for(int i = a; i < b; i++)
18 #define repd(i, a, b) for(int i = b; i >= a; i--)
19 #define sfi(n) scanf("%d", &n)
20 #define pfi(n) printf("%d\n", n)
21 #define MAXN 100010
22 const int N = 810;
23 int n;
24 int a[N][N], b[N][N], c[N][N];
25 int scan()
26 {
27     int res = 0 , ch;
28     while( !( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ ) )
29     {
30         if( ch == EOF )  return 1 << 30 ;
31     }
32     res = ch - ‘0‘ ;
33     while( ( ch = getchar() ) >= ‘0‘ && ch <= ‘9‘ )
34         res = res * 10 + ( ch - ‘0‘ ) ;
35     return res ;
36 }
37
38 int main()
39 {
40     while(~scanf("%d", &n))
41     {
42         repu(i,0,n)
43         repu(j,0,n)
44         {
45             a[i][j] = scan() % 3;
46         }
47         repu(i,0,n)
48         repu(j,0,n)
49         {
50             b[i][j] = scan() % 3;
51         }
52         memset(c, 0, sizeof(c));
53         repu(i,0,n)
54         {
55             repu(j,0,n)
56             {
57                 repu(k,0,n)
58                 {
59                     //c[i][j] += a[i][k] * b[k][j];///会超时
60                     //c[i][k] += a[i][j] * b[j][k];///不会超时
61                     c[j][k] += a[j][i] * b[i][k];///不会超时
62                 }
63             }
64         }
65         for(int i = 0; i < n; i++)
66         {
67             for(int j = 0; j < n; j++)
68             {
69                 c[i][j] %= 3;
70                 if(j) printf(" %d", c[i][j]);
71                 else printf("%d", c[i][j]);
72             }
73             puts("");
74         }
75     }
76     return 0;
77 }

我当时找稀疏矩阵的时候就找到的是直接矩阵相乘的模板,但是还是超时了,后来才知道我的输入挂需要重新更新了。

不过我还有一点疑惑就是为什么同样是三层循环(i,j,k),但是跑出来的时间不一样的呢。。。。。。。

c[i][j] += a[i][k] * b[k][j];///会超时
c[i][k] += a[i][j] * b[j][k];///不会超时
c[j][k] += a[j][i] * b[i][k];///不会超时
时间: 2024-10-10 15:32:05

HDU 4920 居然会超时的相关文章

hdu 4920 快速矩阵相乘 以后得换一种写法了

[题意]:求两个矩阵相乘的结果 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 #define mod 3 6 7 int a[808][802],b[808][802]; 8 int c[808][808],n; 9 10 void mul() 11 { 12 for(int i=0; i<n; i++) 13 for(int j=0; j&

HDU 4920 水

矩阵乘法 因为答案要MOD3,所以矩阵中会有很多值为0,对这些不乘就行了,,,,,,,这样也能水过... BUT : 这样写会超时: for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) for (int k=1; k<=n; k++) c[i][j]+=a[i][k]*b[k][j]; 这样写就能过: for (int k=1; k<=n; k++) for (int i=1; i<=n; i++) for (int j=1;

HDU 4920 Matrix multiplication(矩阵相乘)

各种TEL,233啊.没想到是处理掉0的情况就可以过啊.一直以为会有极端数据.没想到竟然是这样的啊..在网上看到了一个AC的神奇的代码,经典的矩阵乘法,只不过把最内层的枚举,移到外面就过了啊...有点不理解啊,复杂度不是一样的吗.. Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 640 

2014多校第五场1010 || HDU 4920 Matrix multiplication(矩阵乘法优化)

题目链接 题意 : 给你两个n*n的矩阵,然后两个相乘得出结果是多少. 思路 :一开始因为知道会超时所以没敢用最普通的方法做,所以一直在想要怎么处理,没想到鹏哥告诉我们后台数据是随机跑的,所以极端数据是不可能会有的,而我们一开始一直在想极端数据能接受的方法......后来看了鹏哥的做法,就是把是0的地方都跳过就可以了,用矩阵保存前一个非0数的位置是多少.二师兄给我看了一个代码,人家根本没用别的优化,直接将最里层k的循环提到了最外层,然后就AC了,对此我表示无语. 1 #include <cstd

hdu 4920 Matrix multiplication (矩阵计算)

题目链接 题意:给两个矩阵a, b, 计算矩阵a*b的结果对3取余. 分析:直接计算时间复杂度是O(n^3),会超时,但是下面第一个代码勉强可以水过,数据的原因. 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cstring> 5 #include <cstdlib> 6 #include <algorithm> 7 const in

hdu 4920 Matrix multiplication(矩阵坑题)

http://acm.hdu.edu.cn/showproblem.php?pid=4920 被这道题虐了一下午,啥也不说了.继续矩阵吧. 超时就超在每步取余上,要放在最后取余,再者注意三个循环的次序. #include <stdio.h> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <cma

hdu 4920 Matrix multiplication(矩阵相乘)多校训练第5场

Matrix multiplication                                                                           Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Given two matrices A and B of size n×n, find the

HDU 4920(杭电多校训练#5 1010 题) Matrix multiplication(不知道该挂个什么帽子。。。)

题目地址:HDU 4920 对这个题简直无语到极点...居然O(n^3)的复杂度能过....方法有三.. 1:进行输入优化和输出优化..(前提是你的输入优化不能太搓...) 2:利用缓存优化..详情请看该论文.大体就是将后两个for循环换过来,让坐标改变的频率降下来. 3:叉姐题解中说的正规方法..利用biset存储,进行预处理..(其实我还没看懂.. 我只写了个第二种...代码如下,共勉..神奇的小代码.. #include <iostream> #include <cstdio>

矩阵乘法 --- hdu 4920 : Matrix multiplication

Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 820    Accepted Submission(s): 328 Problem Description Given two matrices A and B of size n×n, find the product of them. b