补题 POJ 3318 随机化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补题 POJ 3318 随机化相关的知识,希望对你有一定的参考价值。
题目链接:http://poj.org/problem?id=3318
题意:给你矩阵ABC,要求验证A * B是否等于C。
思路:直接算的话复杂度n^3,妥妥TLE。
随机化有两种方法。
一是不断随机一个列矩阵,左乘验证。
二是不断随机C里的某个点验证。
补充一下随机函数知识点:
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a (结果值含a不含b)。
要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a (结果值含a和b)。
要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1 (结果值不含a含b)。
(总的来说,通用公式:a + rand() % n ;其中的a是起始值,n是整数的范围)
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
其实更简单的是不随机,直接找一个普通的列矩阵左乘就行了。
而且这题数据真的超级水。
有个小tips:
这题如果用随机化的话,C++能过,G++过不了。(涉及精度的POJ上的题也这样)
如果用下面这代码的话,G++能过。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<vector> 7 #include<set> 8 #include<string> 9 #include<sstream> 10 #include<cctype> 11 #include<map> 12 #include<stack> 13 #include<queue> 14 using namespace std; 15 #define INF 0x3f3f3f3f 16 typedef long long ll; 17 int gcd(int a, int b){return b==0?a:gcd(b,a%b);} 18 19 const int maxn = 510; 20 int a[maxn][maxn]; 21 int b[maxn][maxn]; 22 int c[maxn][maxn]; 23 int x[maxn]; 24 int xa[maxn]; 25 int xab[maxn]; 26 int xc[maxn]; 27 int n; 28 29 void input(int d[maxn][maxn]) 30 { 31 for(int i = 1; i <= n; i++) 32 for(int j = 1; j <= n; j++) 33 scanf("%d", &d[i][j]); 34 } 35 36 bool judge() 37 { 38 for(int j = 1; j <= n; j++) 39 { 40 for(int i = 1; i <= n; i++) 41 { 42 xa[j] += x[i] * a[i][j]; 43 xc[j] += x[i] * c[i][j]; 44 } 45 } 46 for(int j = 1; j <= n; j++) 47 for(int i = 1; i <= n; i++) 48 xab[j] += xa[i] * b[i][j]; 49 for(int i = 1; i <= n; i++) 50 if(xab[i] != xc[i]) 51 return false; 52 return true; 53 } 54 55 int main() 56 { 57 // freopen("input.txt", "r", stdin); 58 // freopen("output.txt", "w", stdout); 59 scanf("%d", &n); 60 input(a); 61 input(b); 62 input(c); 63 memset(xa, 0, sizeof(xa)); 64 memset(xab, 0, sizeof(xab)); 65 memset(xc, 0, sizeof(xc)); 66 for(int i = 1; i <= n; i++) 67 x[i] = i; 68 if(judge()) cout << "YES" << endl; 69 else cout << "NO" << endl; 70 return 0; 71 }
以上是关于补题 POJ 3318 随机化的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3318-Matrix Multiplication (n方求矩阵相乘相等)
练习赛补题poj 3026 Borg Maze bfs+最小生成树坑~