CF1475-D. Cleaning the Phone
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的更多相关文章
- 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚
题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...
- Coursera-Getting and Cleaning Data-week1-课程笔记
博客总目录,记录学习R与数据分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html -- Sunday, January 11, 2015 课程概述 G ...
- Coursera-Getting and Cleaning Data-Week2-课程笔记
Coursera-Getting and Cleaning Data-Week2 Saturday, January 17, 2015 课程概述 week2主要是介绍从各个来源读取数据.包括MySql ...
- Coursera-Getting and Cleaning Data-Week3-dplyr+tidyr+lubridate的组合拳
Coursera-Getting and Cleaning Data-Week3 Wednesday, February 04, 2015 好久不写笔记了,年底略忙.. Getting and Cle ...
- Coursera-Getting and Cleaning Data-week4-R语言中的正则表达式以及文本处理
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Thursday, January 29, 2015 补上第四周笔记,以及本次课程总结. 第四周 ...
- 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划
[BZOJ1672][Usaco2005 Dec]Cleaning Shifts Description Farmer John's cows, pampered since birth, have ...
- poj 2376 Cleaning Shifts
http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- POJ 2376 Cleaning Shifts(轮班打扫)
POJ 2376 Cleaning Shifts(轮班打扫) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] Farmer ...
- POJ 2376 Cleaning Shifts 贪心
Cleaning Shifts 题目连接: http://poj.org/problem?id=2376 Description Farmer John is assigning some of hi ...
- Bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 最短路,神题
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 218 Solved: ...
随机推荐
- 关于SSRF与CSRF漏洞的解释
目录 SSRF服务端请求伪造(外网访问内网) 1.SSRF形成原因 2.利用SSRF漏洞的目的 3.SSRF漏洞的用途 4.SSRF漏洞的特性 实例 5.如何挖掘SSRF漏洞 6.常用SSRF去做什么 ...
- 【Linux】Linux进程间通信的几种方式
一.进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据:多个进程要操作共享数据,一个进程对共享数据 信息传递:一个进程需要向另一个进程发 ...
- 映泰主板H100系列安装win7的各种坑
自100系列主板发布以来,windows7好像就被遗弃一样,原因就在于安装win7的时候,会出现USB设备无法使用导致无法安装的问题.主要在于Win7系统没有整合USB的XHCI驱动,而100系列芯片 ...
- 【linux】系统编程-6-POSIX标准下的信号量与互斥锁
目录 前言 8. POSIX信号量 8.1 概念 8.2 POSIX无名信号量 8.3 POSIX有名信号量 8.4 POPSIX信号量与system V信号量的区别 9. POSIX互斥锁 9.1 ...
- 学习Java第一天
public 保证类名和文件名一致 关键字字母全小写,编辑器中有颜色标记 null空常量不能打印 变量就是内存中的存储空间 计算机中最小的存储单元时字节(byte) //1字节(B) = 8位(bit ...
- MYSQL面试题-索引
MYSQL面试题-索引 引自B站up编程不良人:https://www.bilibili.com/video/BV19y4y127h4 一.什么是索引? 官方定义:索引是一种帮助mysql提高查询效率 ...
- JavaScript中原型对象的应用!
JavaScript中原型对象的应用! 扩展内置对象的方法 我以数组对象为例! // 原型对象的应用 扩展内置对象方法! Array.prototype.sum = function() { var ...
- apache状态显示报错AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdo...is message
今天启动apache查看状态发现报错,说不能确认服务器完全确认域名,以下是报错内容: [root@localhost ~]# service httpd status Redirecting to / ...
- 【WPF】将DataGrid内容导出到Excel
引言 在做项目时要求将datagrid的内容导出到Excel,以前做winform项目时遇到过,就把代码搬过来用,但wpf和winform还是有些不同,就修改了一些东西,使其能实现这个功能. 本文是导 ...
- MySQL的sql_mode模式 解决数据Incorrect DECIMAL value: ‘0’ for column ” at row -1问题
https://blog.csdn.net/weiwoyonzhe/article/details/85177294?depth_1-utm_source=distribute.pc_relevant ...