zoukankan      html  css  js  c++  java
  • 关于信息学奥赛构造在数学的一些思考记录

    关于信息学奥赛构造在数学的一些思考记录

    最近学校 C 班老师给了一道题,在这里聊聊。

    问题描述

    给你 (100) 个数 (a_1,a_2,a_3dots a_{99},a_{100})。这 (100) 个数满足:

    • (sumlimits_{i=1}^{100} a_i=1)
    • (|a_i-a_{i+1}|leq frac{1}{50} (iin [1,100)))

    求证:对于任意满足条件的数列 (a),从中取 (50) 个数,至少有一组能满足选出的 (50) 个数的和与 (frac 1 2) 的差不超过 (frac 1 {100})

    解法

    我们考虑用类似贪心的微调法。首先我们可以把数字分为 (50) 组,分别以数对的方式记录下来为:

    [T_1=(a_1,a_2) ]

    [T_2=(a_3,a_4) ]

    [T_3=(a_5,a_6) ]

    [vdots ]

    [T_i=(a_{i*2},a_{i*2+1}) ]

    [vdots ]

    [T_{50}=(a_{99},a_{100}) ]

    接着,我们记 (max(T_i))(T_i) 这个二元组中最大的那个数。(min(T_i)) 同理。

    那么我们有:

    [sumlimits_{i=1}^{50} min(t_i)leq frac{1}{2}leq sumlimits_{i=1}^{50} max(t_i) ]

    假设我们现在选择的 (50) 个数是 (min(T_1),min(T_2)dots min(T_{100})),记目前 (50) 个数的和为 (sum),只要 (|sum-frac 12|>frac{1}{100}),我们就把其中一个 (min(T_i)) 换成 (max(T_i))。这样每次 (sum) 的变化量就在 (0)(+frac{1}{50}) 之间。因为 (sumlimits_{i=1}^{50} min(t_i)leq frac{1}{2}leq sumlimits_{i=1}^{50} max(t_i)),所以我们在微调时一定有一次满足操作前,(sumleq frac{1}{2}),微调后 (sumgeq frac{1}{2})。而微调前后 (sum) 的差值 (leq frac{1}{50}),因此微调前后至少有一组 (50) 个数是满足条件的,得证。

    启发

    我们这道题的解题思路最重要的就是分组的思想,这样减小了两项之间差 (leq frac{1}{50}) 这个条件的影响。这在信息奥赛中应该是有一定应用的,在构造题中是一个好方法。通过对某一个条件进行分析,用某种手段,比如分组,在弱化这一条件带来的影响。这个方法值得学习一下。

    例题自己找

  • 相关阅读:
    PHP权限控制系统PHPGACL
    专注于系统开发
    PHP多条件查询处理
    SMTP协议初探(二)linux下c编程实现发邮件
    linux物理内存探测
    使用select和shutdown
    float & double 内存布局
    网易校园招聘c++题目如何让new操作符不分配内存,只调用构造函数
    linux内存管理概述
    linux物理内存描述
  • 原文地址:https://www.cnblogs.com/huayucaiji/p/zatan1.html
Copyright © 2011-2022 走看看