集训第一天心得

集训第一天心得

一.收获

  1. 当要求出一下式子的结果时,时间效率较高的处理方法:

    int a[maxn],ans;
    for(int i=1;i<=n;i++){
        for(int e=i+1;e<=n;e++){
            for(int j=e+1;j<=n;j++){
    		ans+=a[i]*a[e]*a[j];
            }
    	}
    }
    

    时间效率 O(n3)

    int a[maxn],ans;
    int tot,totway;
    for(int i=1;i<=n;i++){
        ans+=totway*a[i];
        totway+=tot*a[i];
        tot+=a[i];
    }
    

    时间效率 O(n)

    原理解释:讲不清,自行体会

  2. 二分

    • 给定n个元素的数组aim个元素的数组bi,拿每个ai除以bj得到一个商。问这nm个商中第k大值是多少。输出7位小数。

    • n,m105,k109,且数组元素为1109的整数。

    思路:先对b,a排序。二分一个商,分别求出对于每一个b有多少个a满足它。O(mlognlog109)

    优化:我们递增的枚举b中元素,那么满足商要求的a的个数只会越来越多,这样整体上最终对a也会递增的扫一遍。最终总的时间复 杂度O(m+n)log109

    • n个人到一家餐馆点菜。这家餐馆总共有m道菜,每一道菜都有两个属性——美味度和价格。这n个人每周都会来一次,每次只会点一道菜或不点。在这n个人中,有p个人比较挑剔,他们只能接受美味度大于等于一定值ai的菜;有q个人比较贫穷,他们只能点价格小于等于一定值bi的菜。

    • 现在请你计算:这些人至少要来几周,才可能能把餐馆的所有的菜都点过一遍?

    • p+qn50000,m200000

      思路:二分时间(ans)。先对菜用美味度降序排序,对挑剔的人降序排列可以发现每个挑剔的人能吃的菜都是排序之后数组的一段前缀,并且后一个挑剔的人能吃到的菜一定包含前一个人的。把菜按美味度从大到小扔到一个价格的大根堆里,一共扔p次,每次扔的都是第i挑剔的人可以取的,然后取出ans个(不足则全取),作为第i挑剔的人吃的ans道菜。接下来再让穷的人尽量吃,看剩下的菜是否多余正常人的个数×ans

  3. 三分

    • t组数据,n个选手参加比赛,比赛分为跑步和骑车两项,但总长固定。已知每位选手进行每种项目时的速度,求是否可以通过调整各项目长度使某指定选手获胜;如果可以获胜还需输出与第二名的耗时差最大值及此时各项目长度。

    • n20,t100

      不妨设跑步长度为x,易得(要赢的人)tm=xv1+Lxv2=(1v11v2)x+1v2L

      对于与其他人的时间差 dt=(1v1+1vti1v21vt2)x+(1v21vt2)L 显然这是一个一次函数。

      但是我们要求的是第二名的耗时差最大值,即上面的一次函数取最小值中的最大值。

      三分即可

    • 在一个2维平面上有两条传送带,分别为线段AB和线段CD。小燚在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在小燚想从A点走到D点,他想知道最少需要走多长时间。

      思路:直接在AB 上三分,再在 CD 上三分即可。

posted @   轩Demonmaster  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示