• 洛谷 P1199 三国游戏


    参考:Solution_ID:17

    题解 更新时间: 2016-11-13 21:01

    这道题要求最后得到的两方的默契值最大的武将,
    小涵的默契值大于计算机,
    首先,我们这个解法获胜的思路是,每个武将对应的所有配对值中最大的值,已经被拆散
    在这种情况下,场上存在的只剩所有的“次大值”,就是我们拿来排序的那一堆
    这时候小涵拿到了“次大值”中的最大值,肯定是场上最高的分数
    策略就是:
    先考虑最开始的情况:
    1.从武将中找出武将i,记下与i的默契值第二大的武将j,使得i与j的默契值最大
    2.小涵选出i,那么计算机只会选出与i默契值最大的武将p
    此时与p的默契值最大值一定是i。为什么呢?
    假设与p的默契值最大值是k,次大值是k2,第某大的值是i
    那么p-k > p-k2 > p-i
    这里的'-'是对应的意思
    而i-p > i-j
    所以p-k2 > i-j
    也就是与p默契值第二大的值大于与i默契值第二大的值
    显然小涵开始时应该改选p,矛盾。
    因此,我们第一次选了i,取得了次大值中的最大值,同时拆掉了i的最大值和p的最大值
    3.小涵选出l(i的默契值次大值),计算机选m,m是:i,或,l除了与i外,的最大值
    可能有两种原因:一是l-m是l除了与i外的最大值,拆了最大值正合我意
    二是i-m比l除了与i外的最大值更大(但是不会比i-l大,
    因为i的最大值已经拆掉了,次大值就是i-l),即i-l > i-m > (l除了与i外的最大值)
    这时候l的最大值拆不拆都是无所谓的,反正小于我们的i-l
    然后小涵选了n拆了m的最大值m-n
    计算机接着拆最大值,要么是n的最大值,要么比i-l小,证法同上
    两个人就这么拆最大值,就把最大值拆完了,剩下的就是次大值,我们的i-l就是次大值中最大的


    所以还是不要想着证明了,编程拿搜索对拍验证吧,
    找了几十个证明也没看到严谨的,实在是难想。。。

     1 #include<cstdio>
     2 #include<algorithm>
     3 int n;
     4 int a[510][510];
     5 int main()
     6 {
     7     int i,j,maxans=-1;
     8     scanf("%d",&n);
     9     for(i=1;i<n;i++)
    10     {
    11         a[i][i]=-1;
    12         for(j=i+1;j<=n;j++)
    13         {
    14             scanf("%d",&a[i][j]);
    15             a[j][i]=a[i][j];
    16         }
    17     }
    18     a[n][n]=-1;
    19     for(i=1;i<=n;i++)
    20         std::sort(a[i]+1,a[i]+n+1);
    21     for(i=1;i<=n;i++)
    22         if(a[i][n-1]>maxans)
    23             maxans=a[i][n-1];
    24     printf("1
    %d
    ",maxans);
    25     return 0;
    26 }
  • 相关阅读:
    idea资源导出失败的问题
    计算机的运算方法
    ajax返回json字符串,前端显示中文乱码问题解决
    解决xml编码问题:1 字节的 UTF8 序列的字节 1 无效
    【转】erlang四种监控策略one_for_one、one_for_all、simple_one_for_one、rest_for_one
    erlang:register and global:register_name
    【转】重点介绍erlang的global模块
    memset函数用法
    简单实现SQL Server 2012高可用性组
    《mysql必知必会》读书笔记游标的使用
  • 原文地址:https://www.cnblogs.com/hehe54321/p/7340133.html
Copyright © 2020-2023  润新知