*【计蒜客 - 蓝桥训练】人以群分(二分 + dp)

题干:

某班有 nn 个同学,每个同学有一个外向程度 a_iai​。由于要进行某个活动,需要把他们分成若干个小组,每个小组的人数至少为 mm 人。不同外向程度的人在一个小组会产生不开心值,定义一个小组的不开心值为组内成员外向程度最大值和最小值的差,一个班级的不开心值为所有小组不开心值的最大值。

那么问题来了,如何分组使得班级的不开心值最小,请你求出这个最小的班级不开心值。

输入格式

第一行两个整数 n,mn,m,分别表示人数和每个小组最少的人数要求。

第二行 nn 个整数 a_iai​,表示每个同学的外向程度。

输出格式

一个整数,表示最小的班级不开心值。

数据范围

对于 30\%30% 的数据:1\le m \le n \le 201≤m≤n≤20,1\le a_i \le 1001≤ai​≤100。

对于 60\%60% 的数据:1\le m \le n\le 10001≤m≤n≤1000,1\le a_i \le 10001≤ai​≤1000。

对于 100\%100% 的数据:1\le m\le n \le 5\cdot10^51≤m≤n≤5⋅105,1\le a_i \le 10^91≤ai​≤109。

样例解释

第一个样例,只要每个人各自一个组,不开心值就都是 00。

第二个样例,最佳的分组情况为:9,119,11 一个组,6,3,56,3,5 一个组,两个组的不开心值分别为 22 和 33,那么班级的不开心值为 33。

样例输入1复制

5 1
2 4 6 8 10

样例输出1复制

0

样例输入2复制

5 2
9 11 6 3 5 

样例输出2复制

3

解题报告:

这题关键在于怎么check。我们用dp[i]代表:对前i个人进行划分,最后一个可以进行分组的(可以被塞进某个分组的)人的编号。

考虑最后一个人,判断当前第i个人能不能作为当前分组的最后一个人,这就需要找之前分完组后第一个没组可归的人的编号 即dp[i-m]+1。如果能作为最后一个人,那dp[i]=i,否则就是dp[i-1]。

 

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 6e5 + 5;
int n, m;
int a[MAX], dp[MAX];
bool ok(int x) {// dp[0~m-1]=0for (int i = m; i <= n; i++) {if (a[i] - a[dp[i - m] + 1] <= x) dp[i] = i;else dp[i] = dp[i - 1];}return dp[n] == n;
}
int main() 
{cin>>n>>m;for (int i = 1; i <= n; i++) scanf("%d", a+i);sort(a + 1, a + n + 1);int l = 0, r = 1e9;int mid = (l + r) >> 1;while (l < r) {mid = (l + r) >> 1;if (ok(mid)) r = mid;else l = mid + 1;}printf("%d\n", l);return 0;
}

另一个dp做法:

所有数据首先经过排序。 我们如果用dp[i]表示前i个数字在猜测答案x的条件下,是否能够划分成比m大的子集和。那么dp[i]可以去把l…r-1的一串数字染成true,l=i+m,r是第一个不满足a[r]-a[i+1]<=x的位置(当然r可能小于或等于l,这时候不染色)。
 每check一次dp一次,返回的是dp[n]是否为true。
 然而这样的话dp最差是n^2效率,可以想到用树状数组+扫描线或者线段树来改进。但是五十万的数据不允许两个log存在。实际上可以发现由于我们的点查询是从左到右连续的,所以没必要搞树状数组,直接扫描线就行了,然后dp[i]就是i处的覆盖区间数,也就是扫描线数组的前缀和,前缀和大于0相当于为true,否则为false。

原先做n^2的dp的话,是如果dp[i]是true的话,那么后面l~r-1也更新为true。

考虑到这个过程像是区间覆盖,所以可以用端点处+1 ,-1,然后用前缀和来表示真正的dp值(这个前缀和也就是代码里的pre,pre>0表示曾被true覆盖过,,也就是原先意义下的dp[i]=true)。。

只要i是可以达到的,l~r-1就可以从i处增加一个子集来达到。


链接

#include<cstdio>
#include<algorithm>
#include<queue>
#define M (L+R>>1)
using namespace std;int n,a[500005],m,L,R,dp[500005];bool check(int x)
{dp[0]=1;dp[1]=-1;for(int i=2;i<=n;i++)dp[i]=0;int pre=0;for(int i=0,j=1,l,r;i<=n;i++){pre+=dp[i];if(!pre)continue;while(j<=n&&a[j]-a[i+1]<=x)j++;l=i+m;r=j;if(l>=r)continue;dp[l]++;dp[r]--;}return pre>0; 
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+n+1);L=0;R=a[n]-a[1];while(L<R)if(check(M))R=M;elseL=M+1;printf("%d",L);	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

alot英文怎么读_【乐学】“原来如此”用英文怎么说?

英语中的“原来如此”则有几种不同的表达下面就让我们一起来看看吧&#xff01;I seeI see 作为最地道的表达&#xff0c;使用起来准没错。这是来自《柯林斯词典》的释义&#xff1a;You can say "I see" to indicate that you understand what someone is telling y…

【牛客 - 318E】爱摸鱼的Dillonh(数学,暴力,细节)

题干&#xff1a; “我不做人啦&#xff0c;jojo&#xff01;” “Dillonh起来回答问题&#xff01;” “啊&#xff1f;”沉迷于jojo的Dillonh又一次上课摸鱼被老师抓到了&#xff0c;他慌忙地抬起头看着讲台上火冒三丈的老师。 “给你一个数n&#xff0c;现在要找到一个集…

特殊mac地址文档_Mac颜值秒杀Win10?五款神器让Win10化身macOS

微软在Win10上捣鼓已经不是一天两天了&#xff0c;可结果……还是难以令人满意&#xff0c;特别是不伦不类的UI&#xff01;其实Win10的底子还是不错的&#xff0c;新技术用了不少&#xff0c;外观也比之前更有颜值&#xff0c;但……总感觉缺了点什么&#xff01;有没有羡慕隔…

【hihocoder - offer编程练习赛60 A】hohahola(贪心,二分)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 有一种叫作hohahola的饮料&#xff0c;售价是X元一瓶。小Hi非常喜欢这种饮料&#xff0c;但是他现在身无分文。 不过小Hi有N张优惠券&#xff0c;买hohahola时每瓶最多使用一张优惠券&#xff0c…

checkbox设置三种状态 qt_checkbox的三种状态处理

checkbox只有两种值&#xff1a;选中(checked)或未选中(unchecked)。它可以有任何值&#xff0c;但是表单提交时checkbox的值只能是checked或unchecked。它的默认值是unchecked&#xff0c;你可以在HTML中这样控制它&#xff1a;视觉上&#xff0c;checkbox有三种状态&#xff…

【hihocoder - offer编程练习赛60 B】最大顺子(双指针,思维)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 你有N张卡片&#xff0c;每张卡片上写着一个正整数Ai&#xff0c;并且N张卡片上的整数各不相同。 此外&#xff0c;你还有M张百搭卡片&#xff0c;可以当作写着任意正整数的卡片。 一个“顺子…

drupal mysql_Drupal MySQL查询优化

我试图优化一个MySQL查询来加速Drupal视图。这些表是节点&#xff0c;term_node和term_data。节点有大约500k行&#xff0c;term_node大约800k&#xff0c;term_data大约300k。查询下方&#xff1a;SELECT SQL_NO_CACHE DISTINCT(node.nid) AS nidFROM drupal_node nodeLEFT JO…

raft算法mysql主从复制_Etcd raft算法实现原理分析

1.1 主要概念要实现集群数据的一致性&#xff0c;节点在进行通信的时候必定需要遵守特定规则进行数据校验&#xff0c;而这些规则具体都是通过某些具有特定含义的属性来实现的。为了让对Raft 算法比较陌生的读者对算法的关键概念有一个初步认识&#xff0c;作者整理了算法中涉及…

【hihocoder - offer编程练习赛60 C】路径包含问题(LCA,树上倍增)

题干&#xff1a; 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵N的节点的树&#xff0c;节点编号1~N&#xff0c;并且1号节点是根节点。 小Hi会反复询问小Ho一个问题&#xff1a;给定两个节点a和b&#xff0c;有多少对节点c和d满足c < d且c到d的…

【面试题 - 最大值减去最小值小于或等于 num 的子数组数量】滑动窗口

题干&#xff1a; 解题报告&#xff1a; 我们用两个指针&#xff08;i&#xff0c;j&#xff09;分别代表窗口的左边界和右边界&#xff0c;窗口也就是子数组&#xff1b; 用两个双端队列分别维护这个窗口的最大值和最小值&#xff1b; 当窗口扩大时&#xff0c;即j向右扩展时…

mysql根据用户名查询数据_MySQL 查询数据

MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据。 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。 语法 以下为在MySQL数据库中查询数据通用的 SELECT 语法: SELECT column_name,column_name FROM table_name [WHERE Clause…

【牛客 - 370 I 】Rinne Loves Xor(按位前缀和,异或)

题干&#xff1a; Rinne 最近学习了位运算相关的知识&#xff0c;她想运用自己学习的知识发明一个加密算法。 首先她有一个源数组 A&#xff0c;还有一个密钥数组 B&#xff0c;现在她想生成加密后的数组 C。 她发明的方法是&#xff1a;当计算CiCi的时候&#xff0c;首先将…

quartz mysql索引_分布式系统中的定时任务全解(二)

在实际项目中&#xff0c;通常需要用到定时任务(定时作业)&#xff0c;spring框架提供了很好的实现。 1、 下载spring-quartz插件包 这里默认当前系统中是集成了spring框架的基本功能的。去网上下载spring定时器的jar包&#xff0c;这里用的是quartz-all-1.8.4.jar&#xff0c…

【牛客 - 331B】炫酷五子棋(STLset 或Hash,tricks,二维map标记)

题干&#xff1a; 五子棋是一个简单的双人游戏。 小希最近在思索一种更好玩的五子棋。她希望胜利不再是谁先五子连珠谁赢&#xff0c;而变成谁落子后&#xff0c;该子与之前的子五子连珠的次数更多才能胜利。 但是如果是在普通的棋盘上&#xff0c;这个游戏又显得不是很有趣…

【牛客 - 318J】王者荣耀(dp,01背包)

题干&#xff1a; "无论何时何地&#xff0c;都会遵守约定"。"奋力逃吧"。"关于取下敌人性命这件事&#xff0c;也从不失约"。 小懒虫zmx平时最喜欢玩的游戏就是《王者荣耀》&#xff0c;在这款游戏中它也最喜欢百里守约这个英雄。最近&#x…

xodo上的笔记不见了_goodnotes 的笔记无缘无故丢失了一本,还能救回来吗?

真的什么都没有做&#xff0c;很普通的记完笔记放在那里去吃饭&#xff0c;回来的时候&#xff0c;别的笔记都没变化&#xff0c;只有我一直在用、刚记完的那一本消失了……我尝试过的方案&#xff1a;1.icloud刚开始不确定那里有没有&#xff0c;我平时是开着 icloud 对笔记的…

【牛客 - 318G】LLLYYY的数字思维 与【牛客 - 289J】这是一个沙雕题II(贪心构造)

题干&#xff1a; LLLYYY很喜欢写暴力模拟贪心思维。某一天在机房&#xff0c;他突然抛给了队友ppq一 个问题。问题如下&#xff1a; 有一个函数f ()&#xff1a; int f(int x){ int tmp 0; while(x ! 0){ tmp x % 10; x / 10; } return tmp; } 接着…

react div组件设置可点击不可点击_React面试全解

更新:收藏前点个赞亲&#xff0c;为啥我每次写的东西收藏都是赞的n倍&#xff01;&#xff01;花了一个月时间总结的React面试题 希望能帮助到你全文近万字建议保存仔细过一遍目录面试中常提的重要概念React生命周期ReduxRouter重要的方法面试中常提的重要概念1 什么是模块化是…

【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)

题干&#xff1a; 给出一个 n * n 的邻接矩阵A. A是一个01矩阵 . A[i][j]1表示i号点和j号点之间有长度为1的边直接相连. 求出从 1 号点 到 n 号点长度为k的路径的数目. 输入描述: 第1行两个数n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10) 第2行至第n1行&#xff0c;为一个邻接矩阵 …

php mysql 菜鸟_PHP 和 MySQL 基础教程(四)

PHP 和 MySQL 基础教程(四)发布时间&#xff1a;2016-06-17 来源&#xff1a; 点击:次MySQL 中的 SQL对于 MySQL &#xff0c;第一件你必须牢记的是它的每一行命令都是用分号 (;) 作为结束的&#xff0c;但……没有完全绝对的事&#xff0c;在这儿也是一样。前面我曾经讲到&…