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的窗口去判断在窗口内的要替换的最小个数

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string>
  5. #include<string.h>
  6. #include<vector>
  7. #include<utility>
  8. #include<map>
  9. #include<queue>
  10. #include<set>
  11. #define mx 0x3f3f3f3f
  12. #define ll long long
  13. using namespace std;
  14. map<ll,ll>m;
  15. vector<ll>p;
  16. ll a[];
  17. ll quick_pow(ll base,ll k)
  18. {
  19. ll ans=;
  20. while(k)
  21. {
  22. if(k&)
  23. ans=ans*base;
  24. base=base*base;
  25. k=k/;
  26. }
  27. return ans;
  28. }
  29. int main()
  30. {
  31. ll n,k,cap;//容量capacity
  32. scanf("%lld%lld",&n,&cap);
  33. for(int i=;i<n;i++)
  34. scanf("%lld",&a[i]);
  35. sort(a,a+n);
  36. cap=cap*;//给定的容量有多大
  37. int kk=cap/n;//由输入的n和cap可以估计每存一个数需要的最少容量是多少
  38. if(kk>=)//剪枝处理,如果log以2为底kk的对数等于20,解得数字的种类k=2^20,远大于给定输入数据的个数4*10^5
  39. {
  40. printf("0\n");
  41. return ;
  42. }
  43. k=quick_pow(,kk);//由估计的容量kk去解最多可以容纳几种不同的数
  44. m[a[]]++;
  45. p.push_back(a[]);
  46. for(int i=;i<n;i++)
  47. {
  48. if(a[i]!=a[i+])
  49. p.push_back(a[i]);
  50. m[a[i]]++;
  51. }
  52. ll cnt=p.size();
  53. if(cnt<=k)//给定得容量能容纳这些数,就不用减少种类
  54. {
  55. printf("0\n");
  56. return ;
  57. }
  58. else
  59. {
  60. ll l=,r=k-,sum=;
  61. for(int i=l;i<=r;i++)
  62. sum=sum+m[p[i]];//统计重复的数有几个
  63. ll one=n-sum;//只出现一次的数的个数
  64. l++;//滑动窗口,这个窗口的大小是k,[0,k-1]
  65. r++;
  66. while(r<cnt)
  67. {
  68. sum=sum-m[p[l-]]+m[p[r]];
  69. ll temp=n-sum;
  70. one=min(one,temp);
  71. l++;
  72. r++;
  73. }
  74. printf("%lld\n",one);
  75. }
  76. }

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. 动态规划-爬楼梯问题java实现

    最近开始看算法导论,研究了一下动态规划,下面就开始直入主题开始记录近期看的第一个知识点动态规划.提起动态规划就不得不提几个动态规划的金典问题爬楼梯.国王金矿.背包问题.今天就仔细分析一下爬楼梯问题. ...

  2. LeetCode简单题(四)

    题目一: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你 ...

  3. 自定义 directive pagination

    学习angular过程中,对directive 不是很了解,很有必要自己写一个,以便知道它的各方面的处理方式. directive 中 scope 与 controller 交互,有三种定义策略 &q ...

  4. Mybatis遇到的报错

    MyBatis遇到的报错: 1.Caused by: org.xml.sax.SAXParseException; lineNumber: 35; columnNumber: 17; 元素类型为 &q ...

  5. Send key模块发送按键

    filename:send_key.py 1 # Author:Bing # Date:07/19/2017 import SendKeys import win32gui import pywin ...

  6. AD7705/TM7705使用注意事项

    http://bbs.eeworld.com.cn/thread-66467-1-1.html 1 空闲是SCLK=1(C POA),DIN=1(因为写寄存器都是从写通讯寄存器开始,此时第8位必须为0 ...

  7. 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)

    题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...

  8. linux搭建mysql时ifconfig命令无法使用问题

    刚搭建好的Centos 最小安装模式是没有ifconfig命令的.改变步骤:一:使用语句:cd /etc/sysconfig/network-scripts/二:使用语句vi ifcfg-eno167 ...

  9. Day11 - I - 取石子游戏 HDU - 2516

    1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出&q ...

  10. Mybatis 条件判断单双引号解析问题

    最近使用 Mybatis 遇到了一个奇怪的问题,前端传了一个数字字符串(type = "1") ,我做了如下判断: <if test=" type == '1' & ...