题意:给出一堆元素,求一个子集,使子集的乘积最大,如有多个,应该使子集元素个数尽量小。

题解:贪心,如果有大于1的正数,那么是一定要选的,注意负数也可能凑出大于1的正数,那么将绝对值大于1的负数两两配对,

如果还剩下一个绝对值大于1的负数,那么在判断一下,那个负数和比它大的最小负数的乘积是否大于1,如果是那么就选这两个。

把所有可能凑成大于1的数选完以后,剩下的数一定比1小,那么就不选。

如果无法凑出大于1的数,那么再分类讨论一下。

挺容易写错。。。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4+; struct Num
{
int a[maxn];
int id[maxn];
int r[maxn];
int sz;
Num(){sz = ;}
void push(double x,int i){
a[sz] = x*;
r[sz] = sz;
id[sz] = i;
sz++;
} int _upper_bound(int L,int R,int v)
{
while(L<R){
int m = (L+R)>>;
if(a[r[m]]>v) R = m;
else L = m+;
}
return L;
} int _lower_bound(int L,int R,int v)
{
while(L<R){
int m = (L+R)>>;
if(a[r[m]]>=v) R = m;
else L = m+;
}
return L;
}
// int id(int x) { return r[x]; } int operator [](int x){
return a[r[x]];
}
}P,M; int ans[maxn]; #define GetBound(l,r,v,which)\
l = which._lower_bound(,which.sz,v);\
r = which._upper_bound(,which.sz,v); #define Add(which,x)\
ans[sz++] = which.id[which.r[x]]; bool cmp(int x,int y) { return P.a[x] < P.a[y]; }
bool cmp2(int x,int y) { return M.a[x] < M.a[y]; } int main()
{
//freopen("in.txt","r",stdin);
int n; scanf("%d",&n);
bool zero = false;
int pzero;
for(int i = ; i <= n; i++){
double t;
scanf("%lf",&t);
if(t>){
P.push(t,i);
}else if(t<){
M.push(-t,i);
}else if(!zero) {
zero = true;
pzero = i;
}
}
sort(P.r,P.r+P.sz,cmp);
sort(M.r,M.r+M.sz,cmp2);
int m1l,m1r,p1l,p1r;
GetBound(m1l,m1r,,M)
GetBound(p1l,p1r,,P) int sz = ;
int t;
for(t = p1r; t < P.sz; t++) Add(P,t)
int odd = (M.sz - m1r)&;
for(t = m1r+odd; t < M.sz; t++) Add(M,t)
if(odd){
if(m1r> && M[m1r]/.*M[m1r-] > ) { Add(M,m1r) Add(M,m1r-) }
} if(!sz){
int psz = P.sz, msz = M.sz;
if(psz){
if(msz>= && M[msz-]*M[msz-] > P[psz-]* ){
Add(M,msz-) Add(M,msz-)
}else { Add(P,psz-) }
}else {
if(msz>=){
Add(M,msz-) Add(M,msz-)
}else ans[sz++] = pzero;
}
} sort(ans,ans+sz);
printf("%d\n%d",sz,ans[]);
for(int i = ; i < sz; i++) printf(" %d",ans[i]);
putchar('\n');
return ;
}

最新文章

  1. Eclipse不能自动编译 java文件
  2. highcharts的简单使用
  3. JavaScript实现,判断一个点是否在多边形内
  4. linkbutton datagrid showdialog 行效果
  5. Machine Learning and Data Science 教授大师
  6. MD5Encoder加密支持utf-8
  7. java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问
  8. BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
  9. python 得到一个元素的所有下标(网友提供:http://www.oschina.net/code/snippet_212212_38917)
  10. Android RecyclerView完全解析
  11. SLF4J源码解析-LoggerFactory(一)
  12. VirtualBox上安装64位系统
  13. go语言中使用defer、panic、recover处理异常
  14. JS实现下拉单的二级联动
  15. shiro实战系列(二)之入门实战续
  16. Redis 在线管理工具(phpRedisAdmin)介绍
  17. 【CodeForces】741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
  18. python类和元类
  19. Spring 之注解事务 @Transactional(转载)
  20. thinkjphp 模板中获取url中的action

热门文章

  1. Linux下使用sendEmail发送带附件的邮件(转载)
  2. iOS三方支付--微信支付/支付宝支付
  3. ue4 c++ anim notify
  4. Noip2016day1 天天爱跑步running
  5. IT兄弟连 JavaWeb教程 AJAX的技术构成
  6. The database could not be exclusively locked to perform the operation(SQL Server 5030错误解决办法)(转)
  7. 【Sass初级】嵌套选择器规则
  8. NET Core中使用Redis和Memcached
  9. windows/Linux下设置ASP.Net Core开发环境并部署应用
  10. NET Core中使用Apworks