首页 > 其他分享 >P10139 [USACO24JAN] Nap Sort G 题解

P10139 [USACO24JAN] Nap Sort G 题解

时间:2024-02-23 22:12:41浏览次数:33  
标签:Sort int 题解 sum 助手 整数 Nap 数组 Bessie

Description

Bessie 正在尝试使用她自己的排序算法对一个整数数组进行排序。她有一堆共 \(N\)(\(1\le N\le 2\cdot 10^5\))个整数 \(a_1,a_2,\ldots,a_N\)(\(1\le a_i\le 10^{11}\)),她将会按排序顺序将这些数放入一个单独的数组中。她反复查找这堆数中的最小数,将其删除,同时将其添加到数组的末尾。Bessie 在 \(p\) 个数的堆中找到最小数需要花费 \(p\) 秒。

Farmer John 命令了农场中其他一些奶牛帮助 Bessie 完成任务,她们很懒,然而 Bessie 利用了这一点。她将整数分成两堆:Bessie 堆和助手堆。对于 Bessie 堆中的每个整数,她会正常执行她的算法。对于助手堆中的每个整数,她将其分配给不同的助手奶牛。Farmer John 有一个很大的农场,所以 Bessie 可以找来任意多的助手奶牛。如果助手收到整数 \(a_i\),Bessie 会指示该牛小睡 \(a_i\) 秒,并在她们醒来时立即将该整数添加到数组末尾。如果 Bessie 和一个助手同时向数组添加整数,Bessie 的整数将优先被添加,因为她是领导者。如果多个助手被分配了相同的整数,她们会同时将多个该整数添加到数组中。

请帮助 Bessie 划分她的数,使得最终得到的数组是排序的,并使得排序该数组所需的时间最少。

Solution

先把 \(a\) 数组排序,不妨设 Bessie 分配到了 \(k\) 头牛,那么答案一定是 \(a_{n}\) 或 \(\frac{k\times(k+1)}{2}\)。容易发现答案为 \(a_n\) 的情况一定能满足,考虑求后面那个的最小值。

先考虑对于一个 \(k\) 如何求其是否可行,钦定最后一个一定是 Bessie。那么从后往前扫显然剩下的 Bessie 数一定越多越好,但是如果 \(a_i\) 大于后面的最小 sum,则 \(a_i\) 一定要选 Bessie,否则维持现状一定更优。但是如果 \(a_i=sum\) 根据题意同一时间 Bessie 选的牛回放前面,则这个时候 \(a_i\) 会被放到后面的牛的后面,显然不合法。所以 \(a_i\) 选 Bessie 的条件为 \(a_i\geq sum\)。如果最后选了的数量 \(>k\) 就一定可行,否则不可行。

容易发现这个对于 \(k\) 具有单调性,所以二分即可。

时间复杂度:\(O(n\log n)\)。

Code

#include <bits/stdc++.h>

#define int int64_t

const int kMaxN = 2e5 + 5;

int n;
int a[kMaxN];

bool check(int k) {
  int now = 1, sum = k * (k + 1) / 2;
  for (int i = n - 1; i; --i) {
    if (a[i] >= sum) sum -= (now++);
    if (now > k) return 0;
  }
  return 1;
}

void dickdreamer() {
  std::cin >> n;
  for (int i = 1; i <= n; ++i) std::cin >> a[i];
  std::sort(a + 1, a + 1 + n);
  int L = 0, R = n, res = n;
  while (L + 1 < R) {
    int mid = (L + R) >> 1;
    if (check(mid)) R = res = mid;
    else L = mid;
  }
  std::cout << std::min(res * (res + 1) / 2, a[n]) << '\n';
}

int32_t main() {
#ifdef ORZXKR
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
  int T = 1;
  std::cin >> T;
  while (T--) dickdreamer();
  // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
  return 0;
}

标签:Sort,int,题解,sum,助手,整数,Nap,数组,Bessie
From: https://www.cnblogs.com/Scarab/p/18030443

相关文章

  • UOJ228/HDU5828 基础数据结构练习题/Rikka with Sequence 题解(势能线段树)
    势能线段树。如果线段树上一个节点的\(\max-\min\ge2\),我们称其为关键节点,考虑定义势能\(\phi\)为线段树上关键节点的个数。对于每次开方操作,如果当前节点为关键节点,则暴力递归左右儿子修改,否则:如果当前节点\(\max=\min\)或\(\max=\min+1\)且\(\max\)不是完全平方数,......
  • UVA12421 (Jiandan) Mua (I) - Lexical Analyzer 题解
    蒟蒻的第一篇紫题题解!题目传送门思路一眼模拟,还是大模拟。不由得想起了我编了\(4\)个小时的猪国杀……输入首先处理输入,这里我们用一个字符串数组来存储所有的输入,然后再进行处理。while(getline(cin,sr))str[++cnt]=sr+'\n';处理时需要双重循环,注意如果遍历到空格要跳......
  • CF916E Jamie and Tree 题解
    题目链接:CF或者洛谷本题难点在于换根LCA与换根以后的子树范围寻找,重点讲解先说操作一,假如原根为\(1\)变为了\(x\),又变为了\(y\),那么其实\(y\)和\(x\)都可以看做由\(1\)变化而来的,即\(1\rightarrowx\)与\(1\rightarrowy\),原因很简单,我们可以把\(1\rightar......
  • P9901 『PG2』弯曲半平面直线同向图最大流 题解
    思路正解想不出,只好用网络流了网络流简介请戳这儿。这道题数据有点大用EK求最大流似乎过不了,所以本蒟蒻采用Dinic算法。Dinic算法Dinic算法相当于EK的优化。在原基础找增广路的基础上添加了一个分层操作,再通过深搜找阻塞流。分层从原点开始我们把可以通过一步到达的......
  • 记录pyinstaller 打包 pdfplumber 问题解决过程
    今天有一个pdf文件处理需求,使用pdfplumber库完成,python环境是3.11+win10pyinstaller5.10.1打包完成后,工具可以顺利打开,但是执行处理的时候报错File"pypdfium2_raw\bindings.py",line93,in<module>File"pypdfium2_raw\bindings.py",line83,in_register_library......
  • blazor 问题解决
    Cannotprovideavalueforproperty'ScrollToLocationHash'ontype'Microsoft.AspNetCore.Components.Routing.Router'.Thereisnoregisteredserviceoftype'Microsoft.AspNetCore.Components.Routing.IScrollToLocationHash'.异常信息......
  • Go 100 mistakes - #61: Propagating an inappropriate context
       疑问:前两种情况(1.客户端连接中断2.HTTP请求取消)发生,publish却不expire也不会被cancel,这样会不会有问题? ......
  • Jenkins构建提示docker命令权限问题解决方法
    参考:https://zhuanlan.zhihu.com/p/568513293使用Jenkins构建时使用的用户为jenkins在使用docker命令时会报以下错误ERROR:permissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix:///var/run/docker.sock:Get"http://%2Fvar%2Frun%2Fdocker.soc......
  • P6646 [CCO2020] Shopping Plans 题解
    好好玩的题。思路对于前\(K\)小方案问题。我们可以考虑当前方案对下一个方案的转移。重点在于转移的最优化与不重不漏。只有一种种类假设没有\(l,r\)的限制怎么做。我们不妨把所有价格排序。发现一种状态转移到另一种状态,无异与将其中已选择的一个物品不选,选择他后面......
  • process.env.API_KEY undefined问题解决
    问题现象已经在root路径下面创建.env文件,但是使用process.env.API_KEY获取不到值。分析获取不到env文件中的值,检查env文件已配置API_KEY,检查是否安装了dotenv,检查是否导入配置了dotenv解决方法在index.ts中导入import'dotenv/config';应该在使用env的模块前面就导入dote......