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<
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)