每日一题——三国游戏(对角矩阵)

P1199 [NOIP2010 普及组] 三国游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

标题只是为了装bei(bushi)。

这道题一定有解,不可能输出0,为什么?因为我们取的是所有默契值中第二大的,而机器人所取的默契值不可能超过第二大,为什么不是第一大?题目“为了简化问题,保证对于不同的武将组合,其默契值均不相同”,开局的时候第一大的武将cp在你和机器人中各有一个,那么就剩下第二大了,谁先拿到谁就赢。

那么如何取第二大默契值呢?题目只要求我们输出武将cp的最大默契值,那么我们只需要找到当前的第二大默契值即可,就简单的方法就是:取所有默契值中的第二大默契值。然后我就理所应当地输出了所有默契值中的次大,结果拿了20分,为什么呢?因为我理解错题意了,所以第一段的分析也不全对啦!下面就分析一下为什么错,这里样例给了一个坑:输入样例中的最大和次大都在同一个武将身上,那么我们很容易就以为是所有默契值中的次大,其实不见得就是次大的。假如4 5武将的默契值是最大的,而默契值次大的武将cp是2 3(该默契度在2 3武将中的默契度是最大的),一开始我肯定会选5或4武将,而机器人选另一个,那么我就只能找与5匹配的默契度次大的,注意是与5匹配的默契度次大,而不是全体默契度的次大。比如这个例子就无法取全体默契度的次大。

上述例子对应的数据:

6 
5 28 16 29 27 
32 3 20 1 
23 8 26 
33 11 
12 

如果按第一个思路来算就是32,而输出不应该是32,而是29。把它写成对角矩阵以便分析:

     0     5   28   16   29   27
     5     0   32     3   20     1
   28   32     0   23     8   26
   16     3   23     0   33   11
   29   20     8   33     0   12
   27    1    26   11   12     0

继续上面说到例子的分析,假如输出的是所有默契度中次大的话就应该是32,可是32是2 3武将的默契度,如果我们选了2,机器人必选3,那么默契度只能是20(2中的次大),反过来同理得默契度28(3中的次大);如果我们选4的话机器人必选5,默契度为23,反过来同理得默契度为29。因此,我们要找的是每个武将中的默契度的第二大,然后输出这些第二大的默契度的最大值。代码如下:

//输入输出流102ms,快读73ms
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
int n,a[505][505];
//快读
inline int read() {
	int date=0,w=1;
	char c=getchar();
	while(c<'0' || c>'9') {
		if(c=='-') w=-1;
		c=getchar();
 	}
 	while(c>='0' && c<='9') {
 		date=date*10+(c-'0');
 		c=getchar();
	}
	return date*w;
}

int main() {
	n=read();
	for(int i=1; i<=n; i++)
		for(int j=i+1; j<=n; j++) {
			a[i][j]=read();
			a[j][i]=a[i][j];//构建对角矩阵
		}
	int ans=0;
	for(int i=1; i<=n; i++) {
		sort(a[i]+1,a[i]+1+n);//排序
		ans=max(ans,a[i][n-1]);//输出每个武将的次大默契度的最大值
	}
	cout<<1<<endl<<ans;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_谦言万语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值