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 ...
随机推荐
- iOS 开发之 FMDB 源码分析
概念: FMDB 是用于数据存储的框架,它是 iOS 平台下对 SQLite 数据库的封装.FMDB 是面向对象的,它以 OC 的方式封装了 SQLite 的 C 语言 API,使用起来更加方便. C ...
- Centos6.X安装桌面
1.前置环境yum -y groupinstall 'X Window System'2.桌面安装 yum -y groupinstall 'Desktop' 3.语言包yum -y groupins ...
- centos610无桌面安装libreoffice缺失字体
1.安装libreoffice 2.安装fontconfig yum -y install fontconfig 3.安装ttmkfdir yum -y install ttmkfdir 4.检查已有 ...
- faster-RCNN 加入新的Ground Truth
出于project的需要,不仅要detect和classify对象,还希望建立不同class的对象之间的关系,进行所谓的pair-matching. 需要完成以下几步: 1. dataset中labe ...
- 如鹏网仿QQ侧滑菜单:ResideMenu组件的使用笔记整理+Demo
ResideMenu菜单 课堂笔记: https://github.com/SpecialCyCi/AndroidResideMenu Github:如何使用开源组件1. 下载 下载方式: 1. 项目 ...
- java记录5--线程
------------恢复内容开始------------ 1.什么叫程序:是一个严格有序的指令集合.程序规定了完成某一任务时,计算机所需做的各种操作,已经执行顺序. 特点:资源的独占性 执 ...
- LeetCode 876. Middle of the Linked List(获得链表中心结点)
题意:获得链表中心结点.当有两个中心结点时,返回第二个. 分析:快慢指针. /** * Definition for singly-linked list. * struct ListNode { * ...
- CentOS初始化脚本(未完)
#!/bin/bash release=`` .shutdown selinux [ -e "/etc/selinux/config" ] && sed -i 's ...
- 计划任务之一次性计划任务(at)和周期性计划任务(crontab)(重点)
一:知识要点 ----计划任务的意义----计划任务分类----用户计划任务crontab----系统计划任务----计划任务使用注意事项----anacron服务介绍 二:计划任务的意义计划任务 - ...
- Linux centosVMware 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建
一.负载均衡集群介绍 主流开源软件LVS.keepalived.haproxy.nginx等 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做 ...

