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

每日一题——三国游戏(对角矩阵),第1张

P1199 [NOIP2010 普及组] 三国游戏 - 洛谷 | 计算机科学教育新生态 (luogu.class="superseo">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 
#include 
#include 
#include 
#include 
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< 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/787559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)