试题描述
|
输入
|
输出
|
输入示例
|
【输入样例 1】
6 5 28 16 29 27 23 3 20 1 8 32 26 33 11 12 【输入样例 2】 8 42 24 10 29 27 12 58 31 8 16 26 80 6 25 3 36 11 5 33 20 17 13 15 77 9 4 50 19 |
输出示例
|
【输出样例 1】
1 32 【输出样例 2】 1 77 |
其他说明
|
从思想实现来说,还是一道枚举加贪心的题目。因为,“人”在和计算机斗争的过程中,双方都无法取得最大的默契配合值。所以,“人”只能够去考虑次大最优值,但是,为了能够骗过计算机,我们选择的,只能够是跟我们选择的第一位武将配合值次大的那位武将(如果不是一个的话也会被计算机破坏掉)。所以,就要求我们必须,找到,每行中次大值最大的那个值(挺扰人的)。当然,这个提法是建立在我们有了题目中展示的那个矩阵之后。你要注意,题目给你的值是这个矩阵的右半边,你需要把左半边的值自己不上,才能够按照行去枚举(当然,做完后,如果你想按照列,也没有关系,因为全都是对称的,对吧)。
当然,可能有同学考虑到了0的难问题。很遗憾,这道题肯定不会出现零。因为,计算机只能破坏“人”,而且,我也想到了骗他的方法,计算机必输无疑。
下面看一下程序的核心部分:
输入部分:
for (i = 1 ; i < n ; i++) for (j = i + 1 ; j <= n ; j++ ) cin >> s[i][j];
对称复制部分:
for (i = 2 ; i <= n ; i++) for (j = 1 ; j < i ; j++) s[i][j] = s[j][i];
找每行次大值中的最大值部分:
for (i = 1 ; i <= n ; i++) { t1 = t2 = 0; for (j = 1 ; j <= n ; j++) { if (s[i][j] > t1) t1 = s[i][j]; if (t1 > t2) swap(t1, t2); } if (t < t1) t = t1; }
很明显,t为每行次大值(t1)的最大值。也就是我们的所求。
完整C++程序:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int a[505][505]; int main(){ int n; cin >> n; for(int i = 1; i < n; ++i){ for(int j = i + 1; j <= n; ++j){ cin >> a[i][j]; } } for(int i = 2; i <= n; ++i){ for(int j = 1; j < i; ++j){ a[i][j] = a[j][i]; } } int jsj = 0; for(int i = 1; i <= n; ++i){ int js1 = 0; int js2 = 0; for(int j = 1; j <= n; ++j){ if(a[i][j] > js1) js1 = a[i][j]; if(js1 > js2){ int js = js1; js1 = js2; js2 = js; } } if(jsj < js1) jsj = js1; } if(jsj == 0){ cout << jsj << endl; }else{ cout << '1' << endl; cout << jsj << endl; } }