题意很简单,就是两个大矩阵相乘,然后求乘积。
用 的话,当N的规模达到100左右就会StackOverFlow了
况且输入的数据范围可达到800,如果变量还不用全局变量的话连内存开辟都开不出来
1 #pragma comment(linker, "/STACK:16777216") 2 #include3 #include 4 #define ll long long 5 using namespace std; 6 7 const int N=801; //常量N用来定义矩阵的大小 8 int A[N][N],B[N][N],C[N][N]; //定义三个矩阵A,B,C 9 int A11[N][N],A12[N][N],A21[N][N],A22[N][N]; 10 int B11[N][N],B12[N][N],B21[N][N],B22[N][N]; 11 int C11[N][N],C12[N][N],C21[N][N],C22[N][N]; 12 int M1[N][N],M2[N][N],M3[N][N],M4[N][N],M5[N][N],M6[N][N],M7[N][N]; 13 int AA[N][N],BB[N][N],MM1[N][N],MM2[N][N]; 14 15 void input(int n,int p[][N]) //矩阵输入函数 16 { 17 int i,j; 18 19 for(i=0;i >p[i][j]; 23 p[i][j] %= 3; 24 } 25 } 26 27 void output(int n,int C[][N]) //据矩阵输出函数 28 { 29 int i,j; 30 for(i=0;i C 44 for(j=0;j<2;j++) 45 { 46 C[i][j]=0; //计算完一个C[i][j],C[i][j]应重新赋值为零 47 for(t=0;t<2;t++) 48 C[i][j]=(int)(C[i][j]+A[i][t]*B[t][j]+(int)3)%(int)3; 49 } 50 } 51 52 void MATRIX_ADD(int n,int X[][N],int Y[][N],int Z[][N]) //矩阵加法函数X+Y—>Z 53 { 54 int i,j; 55 for(i=0;i Z 61 { 62 int i,j; 63 for(i=0;i > A[i][j];168 A[i][j] %= 3;169 //scanf("%d",&A[i][j]);170 for(i=0; i > B[i][j];173 B[i][j] %= 3;174 //scanf("%d",&B[i][j]);175 for(i=0;i
所有只能考虑一开始肯定会TLE的朴素算法。
想到结果矩阵中只能有三个数,0,1,2
如果存在大量的0,那么就是一个稀疏矩阵,关于稀疏矩阵,我想到:
只需要在第二层循环内,碰到当然数为0则跳过,因为计算结果肯定为0
提交上去。
TLE.....................ORZ
于是开始思考是不是算法的问题,感觉不太科学,过的人也很多,不会太难把。
一直跪到了比赛结束,题说别人也是对稀疏矩阵优化九过了,我在检查了下代码。
发现了一个至关重要的问题,就是我在大规模数据输入输出的时候使用了cin 和 cout
不多说了,贴后来AC的代码:
#pragma comment(linker, "/STACK:16777216")#include#include #define ll long longusing namespace std;const int N=801; //常量N用来定义矩阵的大小int A[N][N],B[N][N],C[N][N]; //定义三个矩阵A,B,Cint main(){ int num; int i,j,k,r; while(scanf("%d",&num)!=EOF){ memset(C, 0, sizeof(C)); for(i=0; i