题目
描述
zzy正在直播玩一个很冷门的游戏。游戏的规则稍微有些复杂。开场时,双方从n名角色中轮流选取角色,然后双方各自选择两名角色出战。任意两名角色之间都有一个“默契值”来表示两名角色一起出战的威力,默契值高的一组将会击败默契值低的一组。zzy为了他的十万点赞正不懈努力。
然而,意想不到的是,这次zzy的对手是zzy的黑粉ghq,他想让zzy在直播中出丑!现在zzy已经占据了先手,换句话说,选择角色的顺序为zzy,ghq,zzy,ghq,…ghq非常不想让zzy胜利,他要尽可能的破坏zzy能够形成的最强角色,所以每次zzy选择完角色后,ghq都会找到剩余角色里能够和zzy手中角色产生最大默契值的角色,并选走他。换句话说,ghq将在zzy已经选择的角色中与剩余角色一一匹配,并选走默契值最大的一组中的剩余角色。
例如,已经有6名角色,他们的默契值关系如下(即样例输入):
!
上面的表格中每一个格代表两名角色之间的默契值。
例如,在第一轮选择中,zzy选择了5号角色,剩余的角色有1,2,3,4,6,其中4号角色和5号角色的默契值最高,ghq选择了5号角色。
在第二轮选择中,zzy选择了3号角色,剩余的角色有1,2,6,其中1号与1号产生的默契值比其他的都大,ghq选择了1号角色。
zzy已经知道了ghq的邪恶计划,并且已经拿到了n名角色的默契值关系。在这样的紧要关头,zzy能否击败ghq,保住自己的十万点赞的目标呢?
输入
去共n行,第一行给出一个n,n为偶数
第2行到第 N行里,第i+1行有n-i个非负整数,每两个数之间用一个空格隔开,表示i号角色和i+1,i+2,…,N号角色之间的默契值(0≤默契值≤1,000,000,000)。
输出
如果zzy可以击败ghq,第一行输出1,第二行输出zzy能选择的最大的默契值。否则,只输出一个-1.
输入样例 1
5 28 16 29 27
23 3 20 1
8 32 26
33 11
12
输出样例 1
32
提示`
n<=500且一定为偶数
样例输入即为题面中的表格。
题目很长,需要一点点的耐心与思维。`
思路
从题目知道就是选取分数最大的组合,但不能连续选取,容易知道,先取牌者必胜,当zzy选取第一张最优牌A,qhq要选取与A最大组合分数的牌B(设此时为状态1),接着下来,zzy要选取牌C,牌C分两种情况,第一种,牌C与A组合能形成当前分数最大值,此时答案就是(A,C);第二种,牌C不能与A形成最大分数,此时情况转化为状态1,可知每一张牌与其他牌形成的最大值必然取不到,只能取到每一张牌与其他牌形成的第二大的值,遍历一遍,求出所有牌与其他牌形成的第二大值的最大值即为答案。
附上代码
#include<bits/stdc++.h>
using namespace std;
int b[502][502];
int n,x,y,ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)cin>>y,b[i][j]=y,b[j][i]=y;
for(int i=1;i<=n;i++){
x=0,y=0;
for(int j=1;j<=n;j++){
if(b[i][j]>x)y=x,x=b[i][j];
else if(b[i][j]>y)y=b[i][j];
}
ans=max(ans,y);
}
cout<<'1'<<'\n'<<ans;
}
<mark>点个赞吧</mark>