码迷,mamicode.com
首页 > 其他好文 > 详细

【补题】 POJ 3318 随机化

时间:2017-08-03 13:44:02      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:string   display   closed   g++   include   std   简单   long   数据   

题目链接: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 随机化

标签:string   display   closed   g++   include   std   简单   long   数据   

原文地址:http://www.cnblogs.com/roMxx/p/7278989.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!