CF1475-D. Cleaning the Phone

题意:

手机上有很多应用非常占用内存,你要清理内存。对于每个应用\(i\)有以下描述:应用\(i\)占用了\(a_i\)的空间,它的方便度为\(b_i\)。

现在让你删除其中部分应用使得删除的应用占用的空间总大小大于等于\(m\)且损失的方便度最小。


思路:

按照方便度将应用分类,每一类按照应用占用的空间大小从大到小排序,之后将每一类应用占用空间的前缀和求出来。

依次枚举删除前\(j\)个方便度为\(1\)的应用,这时已经删除了的应用的总内存空间就是\(pre1[j_1]\),那么还要从方便度为\(2\)的应用中移除\(m-pre1[j_2]\)的空间,这时只需要用\(lower\_bound\)在\(pre2\)中找到这个值就可以了,这里设这个位置为\(j_2\)。每次枚举,它损失的总方便度为\(1*i+2*j\),在所用的情况中取最小的即可。


一些疑问:

1.为什么不都删除方便度为1的应用?

假如有四个应用,占用的空间分别为1,1,1,5,方便度分别为1,1,1,2,现在要m=3,观察一下就可以发现选那个方便度为\(2\)的应用损失的方便度反而更小。

2.为什么要按照方便度划分成两组?

分类之后数据更好处理。如果不划分可以通过内存/方便度的比值进行排序,从前往后加。但这样会出现一个棘手的问题:你从前往后加,加到第\(j\)个数字的时候总空间已经超过\(m\)了,但是第\(j\)个应用的方便度为\(2\),有没有发现问题?可能后面有一个应用,它的方便度为\(1\),虽让它的内存/方便度比第\(j\)个应用小,但是它已经完全可以让前\(j-1\)个应用的空间加上他的空间大小使得总大小大于等于\(m\),但是找这个数字很麻烦,而且会徒增复杂度。

上面复杂的描述已经可以说明问题,我们不想把简单的问题复杂化。


AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector> typedef long long ll; const ll INF = 0x3f3f3f3f3f3f3f3f;
const int Maxn = 200005; ll a[Maxn];
std::vector<ll>b1, b2;
std::vector<ll>pre1, pre2; void solve() {
int n;
ll m, t, sum = 0;
scanf("%d %lld", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%lld", a + i);
sum += a[i];
}
b1.clear();
b2.clear();
for (int i = 0; i < n; i++) {
scanf("%lld", &t);
if (t == 1) {
b1.push_back(a[i]);
} else {
b2.push_back(a[i]);
}
}
if (sum < m) {
printf("-1\n");
return;
}
std::sort(b1.begin(), b1.end(), std::greater<ll>());
std::sort(b2.begin(), b2.end(), std::greater<ll>()); pre1.clear(); pre1.push_back(0); // 这里是因为有可能方便度为1的一个也不选
pre2.clear(); pre2.push_back(0); // 与上同理 for (int i = 1; i <= b1.size(); i++) {
t = pre1[i - 1] + b1[i - 1];
pre1.push_back(t);
}
for (int i = 1; i <= b2.size(); i++) {
t = pre2[i - 1] + b2[i - 1];
pre2.push_back(t);
}
ll ans = INF;
for (int i = 0; i < pre1.size(); i++) {
ll tar = m - pre1[i];
int p = std::lower_bound(pre2.begin(), pre2.end(), tar) - pre2.begin();
if (p == pre2.size()) {
continue;
}
ans = std::min(ans, (ll)(i + p * 2));
}
printf("%lld\n", ans);
} int main() {
int T;
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}

CF1475-D. Cleaning the Phone的更多相关文章

  1. 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚

    题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...

  2. Coursera-Getting and Cleaning Data-week1-课程笔记

    博客总目录,记录学习R与数据分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html -- Sunday, January 11, 2015 课程概述 G ...

  3. Coursera-Getting and Cleaning Data-Week2-课程笔记

    Coursera-Getting and Cleaning Data-Week2 Saturday, January 17, 2015 课程概述 week2主要是介绍从各个来源读取数据.包括MySql ...

  4. Coursera-Getting and Cleaning Data-Week3-dplyr+tidyr+lubridate的组合拳

    Coursera-Getting and Cleaning Data-Week3 Wednesday, February 04, 2015 好久不写笔记了,年底略忙.. Getting and Cle ...

  5. Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周 ...

  6. 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划

    [BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...

  7. poj 2376 Cleaning Shifts

    http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. POJ 2376 Cleaning Shifts(轮班打扫)

    POJ 2376 Cleaning Shifts(轮班打扫) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] Farmer ...

  9. POJ 2376 Cleaning Shifts 贪心

    Cleaning Shifts 题目连接: http://poj.org/problem?id=2376 Description Farmer John is assigning some of hi ...

  10. Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 218  Solved: ...

随机推荐

  1. drop table 命令不回收以前的相关访问权限

    drop table 命令不回收以前的相关访问权限,也就是说假如我现在把表删除了,然后再创建一个同名的表时,会自动赋予权限的.

  2. o_direct刷新方式和文件系统支持Direct i/o

    若让innodb使用o_direct刷新方式,文件系统支持Direct i/o 是非常重要的.为啥

  3. MSDOS(MBR)和GPT磁盘分区表

    MBR和GPT分区 MBR分区:以磁盘的第一个扇区(512byte)记录分区表,其中,446byte存储开机管理程序(MBR 主要开机记录),64byte用于存放分区表 分区实际上是对分区表的修改 M ...

  4. 关于BAPI_GOODSMVT_CREATE中货物移动相关事务代码说明

    BAPI_GOODSMVT_CREATE参数 goodsmvt_code中的GM_CODE是为 BAPI 货物移动分配事务代码 其取值为下面对应的事务代码: 01 MB0102 MB3103 MB1A ...

  5. docker mysql 设置忽略大小写

    使用docker 安装mysql时  Linux下是默认不忽略大小写,导致操作数据库的时候会报如下错误 为了解决上面的问题,我们在创建MySQL容器的时候就需要初始化配置  lower_case_ta ...

  6. Mybatis总结(一)

    Mybatis总结(一) 一.Mybatis启动流程(代码层面) 关于config.xml <?xml version="1.0" encoding="UTF-8& ...

  7. CSS Color Adjustment Module Level 1

    CSS Color Adjustment Module Level 1 https://drafts.csswg.org/css-color-adjust-1/ DarkMode 适配指南 | 微信开 ...

  8. 在线配置热加载配置 go-kratos.dev 监听key

    paladin https://v1.go-kratos.dev/#/config-paladin example Service(在线配置热加载配置) # service.go type Servi ...

  9. Nginx配置代理gRPC的方法

    Nginx配置代理gRPC的方法_nginx_脚本之家 https://www.jb51.net/article/137330.htm

  10. compare-algorithms-for-heapqsmallest

    Compare algorithms for heapq.smallest « Python recipes « ActiveState Code http://code.activestate.co ...