补题 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 }
View Code

 



以上是关于补题 POJ 3318 随机化的主要内容,如果未能解决你的问题,请参考以下文章

随机化初步

POJ 3318-Matrix Multiplication (n方求矩阵相乘相等)

2016暑假集训补题系列——POJ 1475

练习赛补题poj 3026 Borg Maze bfs+最小生成树坑~

练习赛2补题poj 2325 Persistent Numbers 高精度除法+贪心

补题清单