CF 1198 A. MP3 模拟+滑动窗口
题意:给你n个数,一个大小为8*I的容量,保存一个数需要多少容量取决于给定n个数的种类k,用公式 log2 k 计算,如果给定的容量不能保存所有数,选择减少数的种类来降低保存一个数需要的单位容量(通过替换来减少数的种类,数据的总量不变),问最少需要替换多少个数
题解:根据输入数据的关系,可以求得保存一个数需要得最小单位容量kk=8*I / n;
又因为kk= log2 k 可以解得在容量允许情况下,可以保存得最多数据种类k=2kk
又因为输入数据个数得限制n<=4*10^5; 即2kk <=4*10^5;解得kk最小等于20;
所以当kk>=20得时候,一定可以把数据完全保存----------剪枝处理
当kk<20的时候:
由kk= log2 k 解得数据种类k=2^kk (快速幂)
因为要替换的个数最少,肯定是优先替换只出现过一次的数据,
滑动窗口处理[0,k-1]:
用一个大小为k的窗口去判断在窗口内的要替换的最小个数
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string>
#include<string.h>
#include<vector>
#include<utility>
#include<map>
#include<queue>
#include<set>
#define mx 0x3f3f3f3f
#define ll long long
using namespace std;
map<ll,ll>m;
vector<ll>p;
ll a[];
ll quick_pow(ll base,ll k)
{
ll ans=;
while(k)
{
if(k&)
ans=ans*base;
base=base*base;
k=k/;
}
return ans;
}
int main()
{
ll n,k,cap;//容量capacity
scanf("%lld%lld",&n,&cap);
for(int i=;i<n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
cap=cap*;//给定的容量有多大
int kk=cap/n;//由输入的n和cap可以估计每存一个数需要的最少容量是多少
if(kk>=)//剪枝处理,如果log以2为底kk的对数等于20,解得数字的种类k=2^20,远大于给定输入数据的个数4*10^5
{
printf("0\n");
return ;
}
k=quick_pow(,kk);//由估计的容量kk去解最多可以容纳几种不同的数
m[a[]]++;
p.push_back(a[]);
for(int i=;i<n;i++)
{
if(a[i]!=a[i+])
p.push_back(a[i]);
m[a[i]]++;
}
ll cnt=p.size();
if(cnt<=k)//给定得容量能容纳这些数,就不用减少种类
{
printf("0\n");
return ;
}
else
{
ll l=,r=k-,sum=;
for(int i=l;i<=r;i++)
sum=sum+m[p[i]];//统计重复的数有几个
ll one=n-sum;//只出现一次的数的个数
l++;//滑动窗口,这个窗口的大小是k,[0,k-1]
r++;
while(r<cnt)
{
sum=sum-m[p[l-]]+m[p[r]];
ll temp=n-sum;
one=min(one,temp);
l++;
r++;
}
printf("%lld\n",one);
}
}
CF 1198 A. MP3 模拟+滑动窗口的更多相关文章
- 基于滑动窗口协议写的程序(UDP实现) .
正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现. 下面是代码,注释的比较详细了. socket_udp.h #include<st ...
- 剑指0ffer59.滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] ...
- UVa 11572 Unique snowflakes【滑动窗口】
题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...
- 【转】20-TCP 协议(滑动窗口——基础)
https://blog.csdn.net/q1007729991/article/details/70142341 相信大家都遇到过这样的场景: 同学 Luffy 给你打电话,让你记下一串手机号码, ...
- 关于双端队列 deque 模板 && 滑动窗口 (自出)
嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include < ...
- 【Leetcode堆和双端队列】滑动窗口最大值(239)
题目 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示例: 输入 ...
- cogs 495. 滑动窗口 单调队列
495. 滑动窗口 ★★ 输入文件:window.in 输出文件:window.out 简单对比时间限制:2 s 内存限制:256 MB [问题描述] 给你一个长度为N的数组,一个长为 ...
- leetcode全部滑动窗口题目总结C++写法(完结)
3. 无重复字符的最长子串 A: 要找最长的无重复子串,所以用一个map保存出现过的字符,并且维持一个窗口,用le和ri指针标识.ri为当前要遍历的字符,如果ri字符在map中出现过,那么将le字符从 ...
- 剑指offer 面试题. 滑动窗口的最大值
题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
随机推荐
- 【Fine学习笔记】python 文件l操作方法整理
python脚本可以对excel进行创建.读.写.保存成指定文件名,保存到指定路径的操作.整理了以下处理方法: 首先区别几个操作方式: "r" 以读方式打开,只能读文件 , 如 ...
- 21. Regular Expressions--from Apache
转自: http://jmeter.apache.org/usermanual/regular_expressions.html 21.1 Overview¶ JMeter includes the ...
- [WC2018]通道(乱搞,迭代)
[洛谷题面]https://www.luogu.org/problemnew/show/P4221 这个题以及[CTSC2018 暴力写挂]都有类似的乱搞做法能通过考场数据. 具体搞法就是随一个起点, ...
- Es查询结果集默认是10000,更新设置
Es查询结果集默认是10000,结果集大小是int,最大为21亿左右 PUT _all/_settings?preserve_existing=true { "index.max_resul ...
- centos610无桌面安装libreoffice缺失字体
1.安装libreoffice 2.安装fontconfig yum -y install fontconfig 3.安装ttmkfdir yum -y install ttmkfdir 4.检查已有 ...
- JavaScript - onunload失效
参考 https://stackoverflow.com/questions/7794301/window-onunload-is-not-working-properly-in-chrome-bro ...
- 记一次RocketMQ源码导入IDEA过程
首先,下载源码,可以官网下载source包,也可以从GitHub上直接拉下来导入IDEA.如果是官网下载的source zip包,直接作为当前project的module导入,这里不赘述太多,只强调一 ...
- 吴裕雄--天生自然ORACLE数据库学习笔记:过程、函数、触发器和包
create procedure pro_insertDept is begin ,'市场拓展部','JILIN'); --插入数据记录 commit; --提交数据 dbms_output.put_ ...
- Python数据类型-6 字典
字典 Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度.但它是无序的,包含的元素个数不限, ...
- [转]Java——Servlet的配置和测试
本文转自:http://blog.csdn.net/makefish/article/details/6904807 本文以一个实例介绍如何用Java开发Servlet. 主要内容有: 配置和验证To ...

