D 矩阵快速幂

Description

《英雄联盟》(简称LOL)是由美国Riot Games开发,腾讯游戏运营的英雄对战网游。《英雄联盟》除了即时战略、团队作战外,还拥有特色的英雄、自动匹配的战网平台,包括天赋树、召唤师系统、符文等元素。简单来说,LOL是一个10人组的对战游戏,一个队伍(5个人)对抗另一个队伍(5个人),主要目的是拆掉对面的建筑物,一个每个队伍的英雄都扮演着不同的角色,分别为“上单”,“打野”,“中单”,“辅助”,“ADC”,通常的情况是各自队伍的“上单”VS“上单”,“打野”VS“打野”,“中单”VS“中单”,“辅助”VS“辅助”,“ADC”VS“ADC”。上单在LOL中一直是一个很吃香的角色,一般小学生进入匹配以后都会强调一句“锐雯上单不给就送”作为联络暗号。zz_1215和devtang经常玩这个游戏,zz_1215是devtang的宿敌,devtang很想知道zz_1215玩的什么角色,然后他就选同样的角色和zz_1215决斗(solo)。经过观察devtang发现zz_1215选择什么角色是有规律的,那就是取决于他上一次玩的什么角色。现用一个5*5的矩阵来表示,a(i,j)表示上一次如果zz_1215玩的是第j个角色,那么他这一次玩第i个角色的概率为a(i,j)(0<=a(i,j)<=1)),另外有a(1,j)+a(2,j)+a(3,j)+a(4,j)+a(5,j)=1。现在知道zz_1215第一次玩的是什么角色,devtang想知道在第n次游戏中,zz_1215最有可能玩的是什么角色。


Input

首先是一个正整数T,表示有T组数据
每组数据包括
第一行是一个数字n(1<=n<=10^8),表示devtang想知道第n次游戏中zz_1215最可能玩的角色
接下来会给出5*5的矩阵表示概率关系
最后一行给出整数m(1<=m<=5)表示zz_1215第一次游戏玩的角色,角色表示方法见注意事项

Output

输出第n次游戏中,zz_1215最有可能玩的角色,角色表示方法见注意事项,每个输出单独占一行

 

a ij 上一次玩j 这一次就会玩i
概率相同时 选数字小的

Sample Input

2 //T
1
0 0.1 0.2 0.3 0.4
0.4 0 0.1 0.2 0.3
0.3 0.4 0 0.1 0.2
0.2 0.3 0.4 0 0.1
0.1 0.2 0.3 0.4 0
3
2 //第2次玩什么
0 0.1 0.2 0.3 0.4
0.4 0 0.1 0.2 0.3
0.3 0.4 0 0.1 0.2
0.2 0.3 0.4 0 0.1 //看第3列 0.4最大 所以下一次玩4
0.1 0.2 0.3 0.4 0
3 //第一次玩3

Sample Output

3
4

 

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 using namespace std ;
 7 
 8 
 9 struct Matrix
10 {
11     double mat[5][5];
12 };
13 
14 Matrix mul(Matrix a,Matrix b) //矩阵乘法
15 {
16     Matrix c;
17     for(int i=0;i<5;i++)
18         for(int j=0;j<5;j++)
19         {
20             c.mat[i][j]=0;
21             for(int k=0;k<5;k++)
22             {
23                 c.mat[i][j]=(c.mat[i][j] + a.mat[i][k]*b.mat[k][j]);
24             }
25         }
26     return c;
27 }
28 Matrix pow_M(Matrix a,int k)  //矩阵快速幂
29 {
30     Matrix ans;
31     memset(ans.mat,0,sizeof(ans.mat));
32     for (int i=0;i<5;i++)
33         ans.mat[i][i]=1;
34     Matrix temp=a;
35     while(k)
36     {
37         if(k&1)ans=mul(ans,temp);
38         temp=mul(temp,temp);
39         k>>=1;
40     }
41     return ans;
42 }
43 
44 
45 
46 int main ()
47 {
48     //freopen("in.txt","r",stdin) ;
49     int T;
50     cin>>T ;
51     while(T--)
52     {
53         int n , m;
54         cin>>n ;
55         int i , j ;
56         Matrix t ;
57         for (i = 0 ; i < 5 ; i++)
58             for (j = 0 ; j < 5 ; j++)
59                 cin>>t.mat[i][j] ;
60         cin>>m ;
61         if (n == 1)
62         {
63             cout<<m<<endl ;
64             continue ;
65         }
66         n-=1 ;
67         m-=1 ;
68         double MAX = 0 ;
69         int id ;
70         Matrix ans = pow_M(t,n) ;
71 
72         for (i = 4 ; i >= 0 ; i--)
73         {
74             if (ans.mat[i][m] > MAX || abs(ans.mat[i][m] - MAX) < 1e-6)
75             {
76                 MAX = ans.mat[i][m] ;
77                 id = i ;
78             }
79         }
80         cout<<id+1<<endl ;
81 
82 
83     }
84 
85     return 0 ;
86 }
View Code

 

posted @ 2015-05-28 22:58  __Meng  阅读(339)  评论(0编辑  收藏  举报