看似模拟,其实不然

从思想实现来说,还是一道枚举加贪心的题目。因为,“人”在和计算机斗争的过程中,双方都无法取得最大的默契配合值。所以,“人”只能够去考虑次大最优值,但是,为了能够骗过计算机,我们选择的,只能够是跟我们选择的第一位武将配合值次大的那位武将(如果不是一个的话也会被计算机破坏掉)。所以,就要求我们必须,找到,每行中次大值最大的那个值(挺扰人的)。当然,这个提法是建立在我们有了题目中展示的那个矩阵之后。你要注意,题目给你的值是这个矩阵的右半边,你需要把左半边的值自己不上,才能够按照行去枚举(当然,做完后,如果你想按照列,也没有关系,因为全都是对称的,对吧)。
当然,可能有同学考虑到了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)的最大值。也就是我们的所求。
本题,最重要的是想到解决的方法,一旦方法确定,程序实现,相当简单。也望各位选手能够逐渐提高自己的思维方式。让自己的能力逐渐提升。

0 条评论

目前还没有评论...

信息

ID
1809
难度
3
分类
(无)
标签
递交数
835
已通过
427
通过率
51%
被复制
16
上传者