CF-576 C MP3 (离散化)
发布时间:2020-12-16 10:48:14 所属栏目:百科 来源:网络整理
导读:题意:给出序列长度n,以及空间m, 由于题意 k*n = m*8 所以 k = m*8/n;?? num = 2^k 即是 整个序列中不同值的个数 由于ai? (1~1e9) ;然后你要把这个序列 的种类个数减小到 num 个 (问最小减小的个数) 思路:范围太大不能用 数组来记录对应个数 , 所以就使
题意:给出序列长度n,以及空间m, 由于题意 k*n = m*8 所以 k = m*8/n;?? num = 2^k 即是 整个序列中不同值的个数 由于ai? (1~1e9) ;然后你要把这个序列 的种类个数减小到 num 个 (问最小减小的个数) 思路:范围太大不能用 数组来记录对应个数 , 所以就使用离散化压缩一下,然后再对应统计个数,然后再找到最大的连续区间个数,这样我们减下来就是最小改变的个数0≤ai≤ ? 完整代码: ////然后K 对应的K种 #include <algorithm> #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #define ll long long const int maxn = 4e5+1; using namespace std; int arr[maxn]; int a[maxn]; int n,m; int cont[maxn]; ll num; int main(){ while(cin>>n>>m){ int cur= 0; ll K = m*8/n; if(K>33) K=33;//注意k>32位之后我们就之间定为2^33,(太大就会超出精度) int k,Max;//k存储不同的个数,Max用于得到最大的区间和 //还有一个问题就是如果本身总类数小于num就直接输出0 for(int i=0;i<n;i++){ cin>>arr[i]; a[i] = arr[i]; } memset(cont,0,sizeof(cont)); Max = 0; num = (long long)1<<K;//num个不同的数 sort(a,a+n);//保留sort之后的状态 sort(arr,arr+n); k = unique(arr,arr+n) - arr;//不同的个数 for(int i=0;i<k;i++){ for(int j = cur;j<n;j++){ if(a[j]==arr[i]) { cont[i]++; cur++; }else{ break; } } } int tmp = 0; for(int i=0;i<n;i++){ Max = max(Max,tmp); if(i<num) tmp+= cont[i]; else{//第一组结束 tmp = tmp - cont[i-num] + cont[i]; } } if(num>=k) cout<<0<<endl; else cout<<n-Max<<endl; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- react-native – 不变违规:requireNativeComponent:在UIM
- 正则表达式规则(二)
- cocos2dx 移植到android失败,log提示no jni_onload found
- ruby-on-rails – 如何更快地在RoR上运行测试?
- js原生Ajax的封装和原理详解
- 使用NoSQL Manager for MongoDB客户端连接mongodb
- hybrid App开发中关于返回键的逻辑控制
- c# – 如何找到2个IEnumerable对象之间的区别
- 3分钟做一个Flash动画,皮影客能讲好一个UGC动画社区的故事
- xml – NServiceBus端点是否可以使用不同的序列化程序处理和
推荐文章
站长推荐
热点阅读