博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 960C Subsequence Counting
阅读量:5909 次
发布时间:2019-06-19

本文共 1299 字,大约阅读时间需要 4 分钟。

题目链接:

题意:对于任意包含n个元素的集合,他的子集有2^n-1个(不包括空集),然后现在告诉你某个集合的子集中,满足最大元素-最小元素差值<d的子集有x个,现在让你构造一个集合,使得满足上述条件。输出集合大小还有每个元素。集合元素个数大于10000输出-1。

分析:做这道题的时候一直在纠结什么情况输出-1,最后直接判断元素个数,如果大于10000,就输出-1.然后还有不知道自己的策略是不是最优策略,感觉不是最优策略但是AC了。具体思路是我们可以考虑对于任意一个有k个元素的集合,他有2^k-1个子集,如果这个集合的最大元素和最小元素差值小于d,那么所有子集都是满足的,因此可以对于他给定的x,拆分为元素个数为i个的小集合,小集合之间的最大元素和最小元素不满足情况,集合之内的一定满足就可以了。然后对于元素个数为i的小集合,我们只需要任意取i个相同元素就可以了。集合之间为了保证不满足,我们第一个集合从1开始,第二个就是1+d,以此类推就可以了。(我感觉这样不是最优,要想用最少的元素构造最多的满足条件的子集,比如现在要构造x=11,d=3的集合,如果用我的策略,需要构造1 1 1 4 4 7这6个元素来满足,但是如果我们用末尾添加策略(就是在已经构造好的集合最后添加一个元素,使得该元素与已有集合中的m个元素差值小于d,那么这次添加多出的满足条件的子集个数又增加了2^m个)的话,只需要1 2 3 4就可以满足了,所以我的策略应该不是最优,比赛刚打到一半有事出去了,没来的急码,大家可以尝试一下)

AC代码:(不太靠谱策略)

1 #include
2 3 using namespace std; 4 5 long long a[50]; 6 int b[50]; 7 int main(){ 8 ios_base::sync_with_stdio(0); 9 cin.tie(0);10 long long x,d;11 a[0]=1;12 for(int i=1;i<=50;i++){13 a[i]=a[i-1]*2;14 }15 for(int i=0;i<=50;i++){16 a[i]--;17 }18 cin>>x>>d;19 long long n=0;20 memset(b,0,sizeof(b));21 for(int i=50;i>=1;i--){22 if(x>=a[i]){23 b[i]=x/a[i];24 x=x%a[i];25 n+=b[i]*i;26 }27 }28 if(n>10000) {29 cout<<-1<
View Code

 

转载于:https://www.cnblogs.com/ls961006/p/8746675.html

你可能感兴趣的文章
从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
查看>>
[置顶] IT老男人读《因为痛,所以叫青春》
查看>>
Android NDK学习(3)使用Javah命令生成JNI头文件 .
查看>>
poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)
查看>>
LR基础学习_脚本信息函数
查看>>
基于html5 canvas和js实现的水果忍者网页版
查看>>
2、传统的线程互斥synchronized
查看>>
IT忍者神龟之使用 PowerDesigner
查看>>
JSP导出Excel文件
查看>>
谷歌大神Jeff Dean:大规模深度学习最新进展 zz
查看>>
javaweb学习总结(八)——HttpServletResponse对象(二)
查看>>
CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
查看>>
jquery------提供灵活的方法参数
查看>>
Android ContentProvider和getContentResolver
查看>>
深入理解javascript描述元素内容的5个属性
查看>>
Android 知识梳理
查看>>
poj 1331 Multiply
查看>>
解决java.lang.OutOfMemoryError: unable to create new native thread问题
查看>>
POJ - 3294 Life Forms
查看>>
wallproxy on ubuntu usage
查看>>