cf Educational Codeforces Round 52 C. Make It Equal

2024-03-24 07:48

本文主要是介绍cf Educational Codeforces Round 52 C. Make It Equal,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题:
C. Make It Equal
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
There is a toy building consisting of n towers. Each tower consists of several cubes standing on each other. The i-th tower consists of hicubes, so it has height hi.Let’s define operation slice on some height H as following: for each tower i, if its height is greater than H, then remove some top cubes to make tower’s height equal to H. Cost of one “slice” equals to the total number of removed cubes from all towers.

Let’s name slice as good one if its cost is lower or equal to k (k≥n).
在这里插入图片描述
Calculate the minimum number of good slices you have to do to make all towers have the same height. Of course, it is always possible to make it so.

Input
The first line contains two integers n and k (1≤n≤2⋅10^5, n≤k≤10 ^9) — the number of towers and the restriction on slices, respectively.
The second line contains n space separated integers h1,h2,…,hn (1≤hi≤2⋅10^5) — the initial heights of towers.

Output
Print one integer — the minimum number of good slices you have to do to make all towers have the same heigth.

Examples
input
5 5
3 1 2 2 4
output
2
input
4 5
2 3 4 5
output
2
Note
In the first example it’s optimal to make 2 slices. The first slice is on height 2 (its cost is 3), and the second one is on height
1 (its cost is 4).

中文:
给你一堆由正方形叠成的长条,每个长条的高度是hi,表示有hi个正方形叠成,现在给你一个操作,这个操作是选定一个高度,可以去掉这个高度以上的所有方形,但是这些方形的数量不能超过k,问你最少操作多少次,能使得所有长条高度相同。

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
ll n,k;
ll h[200001];
ll sum[200001];
int main()
{ios::sync_with_stdio(false);while(cin>>n>>k){memset(sum,0,sizeof(sum));for(int i=0;i<n;i++)cin>>h[i];sort(h,h+n);ll Max=h[n-1];for(int i=1;i<=Max;i++){sum[i]=n-(ll)(lower_bound(h,h+n,i)-h);}if(sum[Max]==n){cout<<0<<endl;continue;}ll Min=1;for(ll i=Max;i>=1;i--)if(sum[i]==n){Min=i;break;}ll ans=0,tmp=0;int flag=0;for(int i=Max;i>Min;){if(tmp+sum[i]<=k){tmp+=sum[i];i--;}else{flag=1;tmp=0;ans++;}}if(tmp!=0)ans++;cout<<ans<<endl;}return 0;
}

解答:

设定数组sum[i],表示高度大于等于i的条有多少个,那么可以对所有条按照高度进行排序,然后枚举高度i,二分查找高度i所在的下标,用总条数n减去i就是有多少个高度大于等于i的条了。

然后依次贪心的去拿去不超过k个正方形,直到所有条的高度都相同为止。

这篇关于cf Educational Codeforces Round 52 C. Make It Equal的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840915

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

cf 164 C 费用流

给你n个任务,k个机器,n个任务的起始时间,持续时间,完成任务的获利 每个机器可以完成任何一项任务,但是同一时刻只能完成一项任务,一旦某台机器在完成某项任务时,直到任务结束,这台机器都不能去做其他任务 最后问你当获利最大时,应该安排那些机器工作,即输出方案 具体建图方法: 新建源汇S T‘ 对任务按照起始时间s按升序排序 拆点: u 向 u'连一条边 容量为 1 费用为 -c,

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

CF 508C

点击打开链接 import java.util.Arrays;import java.util.Scanner;public class Main {public static void main(String [] args){new Solve().run() ;} }class Solve{int bit[] = new int[608] ;int l

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

认知杂谈52

今天分享 有人说的一段争议性的话 I I 1拓展人脉很重要** 咱们活在这世上啊,得明白一件事儿,知识、逻辑能力和实战经验虽然重要,但确实都不是最关键的。真正关键的是要懂得怎么和那些手里有资源的人打交道。人脉那可真是一笔无形的大财富呢。你想想看,有时候一个有影响力的人帮你一把,那效果可比你累死累活干一年都强得多。 I I 就比如说,你要是认识个行业里的大牛,他可能给你介绍个特别好的工

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>