洛谷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\n") ; 48 printf("%d\n",ans) ; 49 return 0 ; 50 }