A. MP3

 

题意:给你n个数,一个大小为8*I的容量,保存一个数需要多少容量取决于给定n个数的种类k,用公式 logk   计算,如果给定的容量不能保存所有数,选择减少数的种类来降低保存一个数需要的单位容量(通过替换来减少数的种类,数据的总量不变),问最少需要替换多少个数

题解:根据输入数据的关系,可以求得保存一个数需要得最小单位容量kk=8*I n;

又因为kk= logk    可以解得在容量允许情况下,可以保存得最多数据种类k=2kk  

又因为输入数据个数得限制n<=4*10^5; 即2kk  <=4*10^5;解得kk最小等于20;

所以当kk>=20得时候,一定可以把数据完全保存----------剪枝处理

当kk<20的时候:

由kk= log 解得数据种类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 模拟+滑动窗口的更多相关文章

  1. 基于滑动窗口协议写的程序(UDP实现) .

    正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现. 下面是代码,注释的比较详细了. socket_udp.h #include<st ...

  2. 剑指0ffer59.滑动窗口的最大值

    给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] ...

  3. UVa 11572 Unique snowflakes【滑动窗口】

    题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...

  4. 【转】20-TCP 协议(滑动窗口——基础)

    https://blog.csdn.net/q1007729991/article/details/70142341 相信大家都遇到过这样的场景: 同学 Luffy 给你打电话,让你记下一串手机号码, ...

  5. 关于双端队列 deque 模板 && 滑动窗口 (自出)

    嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include < ...

  6. 【Leetcode堆和双端队列】滑动窗口最大值(239)

    题目 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示例: 输入 ...

  7. cogs 495. 滑动窗口 单调队列

    495. 滑动窗口 ★★   输入文件:window.in   输出文件:window.out   简单对比时间限制:2 s   内存限制:256 MB [问题描述] 给你一个长度为N的数组,一个长为 ...

  8. leetcode全部滑动窗口题目总结C++写法(完结)

    3. 无重复字符的最长子串 A: 要找最长的无重复子串,所以用一个map保存出现过的字符,并且维持一个窗口,用le和ri指针标识.ri为当前要遍历的字符,如果ri字符在map中出现过,那么将le字符从 ...

  9. 剑指offer 面试题. 滑动窗口的最大值

    题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

随机推荐

  1. 小白笔记:Git入门之常见命令

    安装 这里就不介绍安装了,度娘一大堆,找不到可以去找谷爹(前提是你能找到).安装好就跟着笔记进行下一步 准备工作 首先我们需要一个可以 git 的东西,所以我们需要一个文件夹和一个文件 创建文件夹 t ...

  2. eclipse 快速隐藏所有方法的代码块

    java开发中往往一个class文件中会有很多方法,一个方法的实现代码有时候特别长 我个人就喜欢把无关的方法代码全部隐藏起来,只打开当前需要编辑的代码就行了(不喜欢看导航视图,容易头晕) Ctrl+s ...

  3. 820算法复试 Eratasthene 质数筛选

    Eratasthene 学问之道无他,求其放心而巳矣 https://blog.csdn.net/qq_37653144/article/details/80470029 class Solution ...

  4. run jumper server

    1. 生成key: $ if [ "$SECRET_KEY" = "" ]; then SECRET_KEY=`cat /dev/urandom | tr -d ...

  5. C#的 IComparable 和 IComparer接口及ComparableTo方法的 区别(非常重要)

    (1)https://blog.csdn.net/ios99999/article/details/77800819 C# IComparable 和 IComparer 区别 (2)https:// ...

  6. 「Luogu P3680 凸轮廓线」

    一道神奇的计算几何题 前置芝士 正三角形,正方形,圆:什么,您都会,那真是太好了. 三角函数的运用:因为我不是很想在这一块写太多,具体可以自行百度. 推导公式 对于一串是圆和正方形开头和结尾时是十分好 ...

  7. 页面美化代码1.x

    页面定制CSS代码 /*接下来是原美化*/ /*接下来是原美化*/ /*接下来是原美化*/ /*接下来是原美化*/ /*接下来是原美化*/ /*接下来是原美化*/ /*接下来是原美化*/ .topic ...

  8. vs Qt,运行后,中文字符显示乱码

    方法一: //在头文件前面加上下面几行代码 #pragma execution_character_set("utf-8") 方法二: //直接中文前面加u8 setWindows ...

  9. 142、Java内部类之在普通方法里面定义内部类

    01.代码如下: package TIANPAN; class Outer { // 外部类 private String msg = "Hello World !"; publi ...

  10. 使用 JvisualVM 监控 spark executor

    使用 JvisualVM,需要先配置 java 的启动参数 jmx 正常情况下,如下配置 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmx ...