传送门

https://www.cnblogs.com/violet-acmer/p/10005351.html

这是一道贪心题么????

题意:

  某展览馆展览一个物品,此物品有n堆,第 i 堆有a[ i ]个正方块,问最多可以去除多少个正方块,使得其俯视图与右视图的保持不变。

  并且去除某正方块a下方的正方块时,是不会导致a方块下降的(无重力)。

题解:

  相关变量解释:

 int n,m;
ll sum;//所有的方块
int a[maxn];//a[i] : 第i堆有a[i]个正方块
int index;//来到第index堆物品
int maxHigh;//当前保留下来的正方块的最大高度
int remain;//必须保留下的正方块个数

  单纯的解释,貌似,不太会,那就用个样例解释吧,哈哈哈。

  例如: 

 Input

 Output
 

  首先,将a[ ]数组按照从小到大的规则排序,排好序后,配图如下:

  大体思路是:

    (1):从第一堆物品开始遍历,定义变量h=a[ i ]-maxHigh,根据maxHigh的定义可知,在第一堆物品之前,是没有方块的,所以,初始化maxHigh=0,那么h代表的就是

    当前堆需要保留的最多的方块数,定义变量len=n-index+1,index表示的是当前来到第index堆,那么len就表示在这之后还有多少堆。

    (2):判断是否可以组成h*h的大正方形,也就是判断len是否大于等于h:

      ①如果可以,例如图片中的红方框,如果可以,那么h*h的正方形上的对角线上的方块是一定要保留的,且是当前正方形需要保留的最少的方块数。

      ②反之,len*len的正方形最少需要保留的方块个数也是其对角线的方块个数。

    (3):当index > n 时,判断maxHigh是否达到了最大高度a[n],如果没有,还需额外保留a[n]-maxHigh个正方块。

具体细节看代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn=1e5+; int n,m;
ll sum;
int a[maxn]; ll Solve()
{
sort(a+,a+n+);
if(n == )
return ;
ll remain=;
int index=,maxHigh=;
while(index <= n)
{
int h=a[index]-maxHigh;
int len=n-index+;
if(len >= h)//可以形成h*h的正方形
{
//注意需要特判h == 0的情况
remain += (h == ? :h);//需要保留的最少的方块数为h个
index += (h == ? :h);//[index,index+h]已经保留过正方块了,直接来到index+h堆
maxHigh += h;//更新前index堆达到的最大高度
}
else//可以形成len*len的正方形
{
remain += len;
index += len;
maxHigh += len;
}
}
remain += (a[n]-maxHigh);//步骤(3)
return sum-remain;
} int main()
{
cin>>n>>m;
for(int i=;i <= n;++i)
cin>>a[i],sum += a[i];
cout<<Solve();
}

Codeforces Round #523 (Div. 2) B Views Matter的更多相关文章

  1. Codeforces Round #523 (Div. 2)

    Codeforces Round #523 (Div. 2) 题目一览表 来源 考察知识点 完成时间 A Coins cf 贪心(签到题) 2018.11.23 B Views Matter cf 思 ...

  2. Codeforces Round #523 (Div. 2) Solution

    A. Coins Water. #include <bits/stdc++.h> using namespace std; int n, s; int main() { while (sc ...

  3. Codeforces Round #523 (Div. 2) E. Politics(最小费+思维建图)

    https://codeforces.com/contest/1061/problem/E 题意 有n个点(<=500),标记第i个点的代价a[i],然后分别在这n个点建两棵树,对于每颗树的每个 ...

  4. Codeforces Round #523 (Div. 2) F. Katya and Segments Sets (交互题+思维)

    https://codeforces.com/contest/1061/problem/F 题意 假设存在一颗完全k叉树(n<=1e5),允许你进行最多(n*60)次询问,然后输出这棵树的根,每 ...

  5. Codeforces Round #523 (Div. 2) Cdp

    题:https://codeforces.com/contest/1061/problem/C 题意:给你一个序列,我们求他们子序列的个数,这个子序列有个限制就是每一个子序列上的值都必须是能整除他的下 ...

  6. Codeforces Round #523 (Div. 2) D. TV Shows 模拟(多重集 先把所有区间加入多重集合)+贪心+二分

    题意:给出n个电视节目的起始和结束时间  并且租一台电视需要x +y*(b-a)  [a,b]为时段 问完整看完电视节目的最小花费是多少 思路:贪心的思想 情况1 如果新租一台电视的花费<=在空 ...

  7. Codeforces Round #523 (Div. 2) D. TV Shows

    传送门 https://www.cnblogs.com/violet-acmer/p/10005351.html 题意: 有n个节目,每个节目都有个开始时间和结束时间. 定义x,y分别为租电视需要的花 ...

  8. Codeforces Round #523 (Div. 2) C Multiplicity (DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/10005351.html 题意: 给定一数组a[],从a[ ]中除去任意个元素得到b[ ],求能形成多少“好序列 ...

  9. Codeforces Round #523 (Div. 2) C. Multiplicity

    C. Multiplicity 题目链接:https://codeforc.es/contest/1061/problem/C 题意: 给出一串数,问它的“好序列“有多少.好序列的定义是,首先是一个子 ...

随机推荐

  1. JQ获取URL中是否含有某个字符的话,对页面进行某种操作

    一.//JQ获取URL中是否含有某个字符的话,对页面进行某种操作 例:如果URL中含有xia的字符,就在页面引入一个cssvar str=window.location.href; //获取地址栏UR ...

  2. RuntimeError: cryptography requires setuptools 18.5 or newer, please upgrade to a newer version of setuptool

    setuptool 太老了,更新下: pip install --upgrade setuptools

  3. Stream、FileStream、MemoryStream的区别

    1.Stream:流,在msdn的定义:提供字节序列的一般性视图,Stream提供了读写流的方法是以字节的形式从流中读取内容.而我们经常会用到从字节流中读取文本或者写入文本,微软提供了StreamRe ...

  4. nodejs zip 安装配置

    1.下载 下载地址:https://nodejs.org/zh-cn/download/ 选择相应的版本下载 2.解压缩 将文件解压到要安装的位置,并新建两个目录 node-global :npm全局 ...

  5. moogodb 安装及简单介绍

    1,安装Moogodb 因为是windows 64位操作系统,直接到官网上下载.msi文件,下载完成后点击安装,点击同意协议之后,出现下面的对话框, Choose Setup Type, 就是选择安装 ...

  6. Nginx 防盗链 secure_link 模块

    L:76 需要通过 --with-http_secure_link_module 编译进Nginx secure_link 指令 Syntax: secure_link expression; Def ...

  7. 解决Maven依赖报错问题

    问题现象:从svn上签下源代码,本地执行打包命令,提示如下错误: [ERROR] Failed to execute goal on project dddwriter: Could not reso ...

  8. Row_Number() over()

    分页 ROW_NUMBER() OVER (order by ID) 是先把ID列排序,再为排序以后的每条ID记录返回一个序号.

  9. Codeforces Round #468 Div. 1

    D:首先考虑如果给定白棋位置,如何判断胜负.黑棋获胜需要四个方向都有能贴上白棋的棋子.由于每一轮都必须移动,显然先对平面黑白染色一下,只有与白棋所在格异色的黑棋才需要考虑.考虑让一个黑棋去贴上白棋某个 ...

  10. 洛谷3707 [SDOI2017] 相关分析 【线段树】

    分析: 化简一下就行了,注意一下平方和公式的运用以及精度的误差. 代码: #include<bits/stdc++.h> using namespace std; ; int n,m; i ...