洛谷P1199 三国游戏 博弈论 数学

洛谷P1199 三国游戏
博弈论 数学

这道题 其实 人是必胜的
能取到的最大值 为 每行第二大值中的最大值

为什么呢
假使第一次我们取到了我们心中的那个答案的所在行
那么接着电脑会取 这一行最大值的对应行
那么我们来分析一下电脑取的那个数在他取的那行的特点

首先我们假设其不是最大值,因为矩阵中任意两个数不相同
所以也就是说还有个数比他大,然后就是说电脑取的第二大或者第n大值就已经
比我们取的第一大值要大了,说明我们取的行并不是每行第二大值中的最大值所在
的行
2、也就是说这个数必定为该行中的最大值
那么就是说,这样一来,电脑和我们都取不到最大值,而我们是可以取到第二大值,
电脑也是可以取到该行中第二大值的,既然都可以取到第二大值,那么我们肯定是取
最大的第二大值,所以就是答案了,
3、换句话说,就是我们每次想取到最大值,然后电脑都会来破坏,于是最终我们只能取
到第二大值

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <iostream> 
 9 using namespace std ; 
10 
11 const int maxn = 511,inf = 1e9 ;
12 int n,m,first,second,ans ;  
13 int a[maxn][maxn] ; 
14 
15 inline int read() 
16 {
17     char ch = getchar() ; 
18     int x = 0 ,f = 1 ; 
19     while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 
20     while(ch>='0'&&ch<='9') { x = x*10+ch-48 ; ch = getchar() ; } 
21     return x*f ; 
22 }
23 
24 int main() 
25 {
26     n = read() ;  
27     for(int i=1;i<=n;i++) 
28         for(int j=i+1;j<=n;j++) a[ i ][ j ] = read() ; 
29     for(int i=1;i<=n;i++) 
30         for(int j=1;j<i;j++) a[ i ][ j ] = a[ j ][ i ] ; 
31     for(int i=1;i<=n;i++) a[ i ][ i ] = -inf ; 
32     
33     ans = -inf ; 
34     for(int i=1;i<=n;i++) 
35     {
36         first = -inf ;  second = -inf ; 
37         for(int j=1;j<=n;j++) 
38             if(a[ i ][ j ] > first ) 
39             {
40                 second = first ; 
41                 first = a[ i ][ j ] ; 
42             } 
43             else if(a[ i ][ j ] > second) 
44                     second = a[ i ][ j ] ; 
45         ans = max(ans,second) ; 
46     }
47     printf("1
") ; 
48     printf("%d
",ans) ; 
49     return 0 ; 
50 } 
原文地址:https://www.cnblogs.com/third2333/p/7083298.html