首页 > 其他分享 >模拟赛 T1 好做法

模拟赛 T1 好做法

时间:2024-05-26 20:14:46浏览次数:26  
标签:limits 法力 int sum 个数 T1 进位 做法 模拟

不服来叉

首先肯定要二分答案 \(k\),然后肯定留最大的 \(k\) 个数,

考虑删除剩下 \(n-k\) 个数的策略,肯定是倒着删,考察一下删除倒数第 \(i\) 个数的时候到底发生了什么,

这里我们先假设之前 \(i-1\) 个数可以成功删掉,否则可以在前面判断出不能删,

不妨考虑在删之前 \(i-1\) 个数的时候,如果 \(x\) 有法力值分给了这 \(i\) 个数中的 \(k\),视为 \(x\) 向 \(k\) "进了一位",

那我们就要使得之前 \(i-1\) 个数对 \(i\) 的"进位",也就是分给 \(i\) 的法力值尽量少,

显然有策略:对每个数 \(x\),先把法力值分给所有不会产生进位的 \(n-i\) 个数,剩余的法力值留下来进位,

可以看成是填一个 \(i\) 行 \(n-i\) 列的矩阵,每次填一行,多余的法力值留到之后的行,

那这样留到最后一行的进位个数就是 \(\sum\limits_{x=1}^{i-1}v_x-(i-1)(n-i)\),

那么 \(i\) 需要分出去的法力值就是 \(v_i\) 加上进位,也就是 \(\sum\limits_{x=1}^iv_x-(i-1)(n-i)\),

\(i\) 只能把法力值分给剩下 \(n-i\) 个数,所以 \(\sum\limits_{x=1}^iv_x-(i-1)(n-i)\le n-i\),如果满足条件那 \(i\) 就能被删掉,否则 \(i\) 删不掉。

#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
int T, n, a[5000050];
inline int R()
{
    int q = 0;
    char c = getchar();
    while (c < '0' || c > '9')
        c = getchar();
    while (c >= '0' && c <= '9')
        q = q * 10 + c - '0', c = getchar();
    return q;
}
bool C(int k)
{
    int z = 0;
    for (int i = n; i > k; --i)
    {
        z += a[i - k];
        if (z > (n - i + 1) * (i - 1))
            return 0;
    }
    return 1;
}
signed main()
{
    freopen("magic.in", "r", stdin);
    freopen("magic.out", "w", stdout);
    T = R();
    while (T--)
    {
        n = R();
        for (int i = 1; i <= n; ++i)
            a[i] = R();
        sort(a + 1, a + n + 1);
        int l = 1, r = n;
        while (l <= r)
        {
            int m = l + r >> 1;
            if (C(m))
                r = m - 1;
            else
                l = m + 1;
        }
        printf("%lld\n", l);
        for (int i = 1; i <= n; ++i)
            a[i] = 0;
    }
    return 0;
}

标签:limits,法力,int,sum,个数,T1,进位,做法,模拟
From: https://www.cnblogs.com/5k-sync-closer/p/18214205

相关文章

  • 轻松拿捏C语言——【字符串函数】的使用及模拟实现
    ......
  • 【元胞自动机】基于元胞自动机模拟社会力模型解决人员疏散问题附Matlab代码
    【元胞自动机】基于元胞自动机模拟社会力模型解决人员疏散问题附Matlab代码首先,元胞自动机(CellularAutomata,简称CA)是一种离散动力系统,由一个规则化的网络组成,每个元胞根据自身状态和周围邻居元胞的状态更新自身状态。CA模型已被广泛应用于模拟各种复杂系统,包括人群......
  • strcat函数及其模拟实现(C语言)
    1.前言C语言中的库函数有很多,有关于处理字符串的函数有很多。在本文中,我将为大家介绍处理字符串较为常用的一个函数——strcat函数希望读者们能够好好看,大家一起进步!......
  • 基于arduino uno的DHT11温湿度传感器的使用
    安装DHT库由于arduinoIDE本身无法直接下载DHT库,在网上寻找第三方库,链接是gitee的,国内能直接访问https://gitcode.com/markruys/arduino-DHT下载为zip包后导入IDE中,具体步骤:项目->管理库->添加.zip库->选择下载的zip包使用示例按照下面图示使用即可出于某种原因如果无法使......
  • C++初阶学习第九弹——探索STL奥秘(四)——vector的深层挖掘和模拟实现
    string(上):C++初阶学习第六弹——探索STL奥秘(一)——标准库中的string类-CSDN博客string(下):C++初阶学习第七弹——探索STL奥秘(二)——string的模拟实现-CSDN博客vector(上):C++初阶学习第八弹——探索STL奥秘(三)——深入刨析vector的使用-CSDN博客前言:在前面我们已经学习了string的......
  • react19.0.0 调试工具
    react19.0.0调试工具网友的力量百度网盘:链接:https://pan.baidu.com/s/1eeoUNfHpn20gtnuo-mlgkg提取码:7hhf手动构建React采用monorepo管理方式,仓库下面有多个独立包,进入react-devtools-extensions包中cdpackages/react-devtools-extensions查看package.json,......
  • 【数据结构与算法 | 基础篇】单向链表模拟栈
    1.前言前文我们先后用单向循环链表,环形数组来模拟了队列.队列的特点是先进先出.队头移除元素,队尾添加元素.所以需要两个指针控制.本文我们接下来提及如果和单向链表来模拟栈.栈的特点是后进先出.在栈顶压栈或弹栈.另一侧不动的是栈底.我们可以初始化哨兵节点,自哨兵节......
  • 【数据结构与算法 | 基础篇】数组模拟栈
    1.前言前文我们刚提及了如何用单向链表来模拟栈.我们还可以用数组来模拟栈.使用栈顶指针top来进行栈顶的操作.2.数组模拟栈(1).栈接口publicinterfacestack<E>{//压栈booleanpush(Evalue);//弹栈,栈非空返回栈顶元素Epop();//返回栈......
  • react19.0.0 仓库构建
    react19.0.0仓库构建运行指令npmrunbuild报以下错误panminxiang@Macreact%npmrunbuild>build>node./scripts/rollup/build-all-release-channels.jsBUILDINGreact.development.js(node_dev)COMPLETEreact.development.js(node_dev)BUILDINGreac......
  • react19.0.0 仓库安装
    react19.0.0仓库安装克隆仓库到本地:gitclonehttps://github.com/facebook/react.gitReactVersions中可以看到当前版本为19.0.0在项目下有个.nvmrc文件,指定了node版本为18.20.0(react18.3.1配套的node版本为14.17.6这跨度有点大啊)安装node18.20.0nvmins......