题意

有 $n$ 种树,每种树都有高度 $H_i$,费用 $C_i$,数量 $P_i$,现要砍掉一些树,使得剩下的树中最高的树的数量超过一般,求最小的费用。($1 \leq n \leq 10^5, \ 1 \leq H_i \leq 10^9, \ 1 \leq C_i \leq 200, \ 1 \leq  P_i \leq 10^9$)

分析

首先,容易想到我们应该枚举最高树的高度,将更高的全部砍掉,再从低的中选取k个费用最小的砍掉。

重点在于如何求出当前最小费用的k个。

注意到 $C_i$ 的范围非常小,所以我们可以统计费用为 $i$ 的树的个数,记为 $C[i]$(相当于建立200个桶)。

按高度从低到高排好序,遍历一遍,得到全局最小费用。复杂度为 $O(200n)$,如果二分查找就能做到 $O(log200\cdot n)$.

#include<bits/stdc++.h>
using namespace std;
#define LL long long
struct tree{
LL h,c,p;
}a[];
bool cmp(tree a,tree b){
return a.h<b.h;
}
LL n;
LL tmp=,ans=,tot=;
LL num[];
int main(){
while(cin>>n){
memset(num,,sizeof(num));
ans=tmp=tot=;
for(LL i=;i<n;++i){
scanf("%lld%lld%lld",&a[i].h,&a[i].c,&a[i].p);
tmp+=a[i].c*a[i].p;
}
ans=tmp;
sort(a,a+n,cmp);
for(LL i=,j;i<n;i=j){
j=i;while(a[j].h==a[i].h&&j<n)++j;
LL sum=;
LL cost=;
for(LL t=i;t<j;++t){
tmp-=a[t].c*a[t].p;
tot+=a[t].p;
sum+=a[t].p;
}
sum=tot-sum*+;
for(LL w=;sum>;++w){
if(num[w]<=sum){
cost+=w*num[w];
sum-=num[w];
}else{
cost+=sum*w;
break;
}
}
ans=min(ans,cost+tmp);
for(LL t=i;t<j;++t){
num[a[t].c]+=a[t].p;
}
}
cout<<ans<<endl;
}
}

参考链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41065020

2019牛客多校C Governing sand——桶&&思维题的更多相关文章

  1. 2019牛客多校D move——乱搞&&思维题

    题意 给定 $n$ 个物品,体积分别为 $v_i$,现有 $K$ 的容积一样的箱子,按如下策略装入物品:每次选取尽可能大的装入(较大的不能装入时可以向小的找),依次装入箱子. 分析 首先,不具有严格的 ...

  2. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  3. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  4. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  5. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  6. 2019牛客多校 Round4

    Solved:3 Rank:331 B xor 题意:5e4个集合 每个集合最多32个数 5e4个询问 询问l到r个集合是不是都有一个子集的xor和等于x 题解:在牛客多校第一场学了线性基 然后这个题 ...

  7. 2019牛客多校第七场C-Governing sand(线段树+枚举)

    Governing sand 题目传送门 解题思路 枚举每一种高度作为最大高度,则需要的最小花费的钱是:砍掉所有比这个高度高的树的所有花费+砍掉比这个高度低的树里最便宜的m棵树的花费,m为高度低的里面 ...

  8. 2019牛客多校第一场E ABBA(DP)题解

    链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...

  9. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

随机推荐

  1. SQL Server直接执行.sql文件

    SQL Server直接执行.sql文件    客户的数据库数据被篡改,利用Log Explorer工具根据日志生成的回滚脚本有200多M,不可能一下子扔到查询分析器里去执行,于是想是否SQL Ser ...

  2. Office 2016、2019 与 Office 365 的区别

    点开观看更清晰:

  3. post请求 大坑 注意点

    如果后台接收的是一个list 前台请求的时候 PLdelete() { //批量删除流量计 console.log(this.multipleSelection instanceof Array,9) ...

  4. LOJ6583 ICPC World Finals 2019何以伊名始(广义后缀自动机)

    对trie建SAM,询问串倒过来跑到的节点的|right|即为答案. #include<bits/stdc++.h> using namespace std; #define ll lon ...

  5. Luogu5284 十二省联考2019字符串问题(后缀树+拓扑排序)

    对反串建SAM弄出后缀树,每个b串通过倍增定位其在后缀树上对应的节点,根据其长度将节点拆开.然后每个a串也找到对应的节点,由该节点向表示a串的节点连边,再把所给的边连上跑拓扑排序即可. #includ ...

  6. BZOJ4566 HAOI2016找相同字符(后缀自动机)

    对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然 ...

  7. Linux下如何查看tomcat是否启动、查看tomcat启动日志

    在Linux系统下,重启Tomcat使用命令的操作! 1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh ...

  8. SQL Server系统函数:类型转换函数

    原文:SQL Server系统函数:类型转换函数 1.基本的转化 SELECT CAST(2008 as varchar(4)) + ' year!' SELECT CONVERT(varchar(4 ...

  9. call、apply、bind一直是不求甚解!

    一直感觉代码中有call和apply就很高大上(看不懂),但是都草草略过,今天非要弄明白!以前总是死记硬背:call.apply.bind 都是用来修改函数中的this,传参时,call是一个个传参, ...

  10. background 背景图片 --css3

    background 1.设置背景平铺background-repeat round :图片会进行缩放后平铺space : 图片会进行平铺,中间留下空白空间 注:当滚动行为设为fixed,round和 ...