P1199 三国游戏

P1199 三国游戏

题解

这是一道贪心题

 

分析一下

每个默契值关系到两个武士

 小涵先选武士,为了保证最大默契值

肯定是会找到一个默契值最大的数字,选择其中这两个武士当中的一个

那么无论是选哪一个,下一个轮到机器选,一定会把另一个武士选中,组织小涵胜利

显然最大默契值一定不会成为本题答案

 

考虑次大默契值

我们在考虑最大默契值的时候,小涵一定确定了一个武士,如果次大默契值与最大默契值同行或者同列,那么小涵下一步选择它,就构成了最优答案,输出即可

我们继续寻找下一个大的默契值

 

 

代码

#include<bits/stdc++.h>

using namespace std;

int cnt,n,mp;
bool vis[1000010];

struct node
{
    int x;
    int y;
    int w;
}jiang[1000010];

bool cmp(node x,node y)
{
    return x.w >y.w ;
}

int main()
{
    scanf("%d",&n);
    cnt=0;
    
    for(int i=1;i<=n-1;i++)
      for(int j=i+1;j<=n;j++)
      {
          scanf("%d",&mp);
          jiang[++cnt].w =mp;
        jiang[cnt].x =i;
        jiang[cnt].y =j;
      }
    
    sort(jiang+1,jiang+cnt+1,cmp);
    
    int flag=0;
    
    vis[jiang[1].x ]=1;
    vis[jiang[1].y ]=1;
    for(int i=2;i<=cnt;i++)
    {
        if(vis[jiang[i].x] ||vis[jiang[i].y ])
        {
            printf("1\n");
            printf("%d\n",jiang[i].w );
            return 0;
        }
        else
        {
            if(!vis[jiang[i].x] ) vis[jiang[i].x]=1;
            if(!vis[jiang[i].y] ) vis[jiang[i].y]=1;
            
        }
    }
    printf("0\n");
    return 0;
}

 

 


 

一开始用模拟做的,敲了将近一百多行,发现可以缩短成不到60行QWQ

posted @ 2019-06-16 10:32  晔子  阅读(348)  评论(0编辑  收藏  举报