Codeforces gym 100685 E. Epic Fail of a Genie 贪心
E. Epic Fail of a Genie
Time Limit: 20 Sec
Memory Limit: 256 MB
题目连接
http://codeforces.com/gym/100685/problem/E
Description
Input
The first line of input contains an integer N (2 ≤ N ≤ 104) — the cardinality of a set of numbers.
The second line of input contains N floating-point numbers with absolute value not more than 106. The fractional part of each number does not contain more than two digits.
Output
The first line of the output should contain a single integer M — the total number of numbers that genie should choose from the set.
The second line of output should contain 1-based indexes of these numbers. Indexes must be sorted in ascending order. If multiple solutions exist please output the one with the minimal subset cardinality. If there are still several suitable solutions output any of them.
Sample Input
7
1 3 0 -1 -2 0.5 3
Sample Output
4
2 4 5 7
HINT
题意
给你一个集合,让你选择出一个非空子集,使得乘积最大
题解:
1.大于1的正数必选
2.乘起来大于1的负数对也要选择
如果都没有
那么选择俩乘起来大的负数,或者一个较大的正数
虽然感觉会卡eps……
但是并没有?
代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define test freopen("test.txt","r",stdin)
#define maxn 20001
#define mod 1000000007
#define eps 1e-9
const int inf=0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fLL;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
//************************************************************************************** vector<int> Q;
struct node
{
int x,y;
};
struct point
{
double x;
int y;
};
bool cmp(point a,point b)
{
return a.x<b.x;
}
double a[maxn];
vector<point> T;
int main()
{
node tmp;
tmp.x=,tmp.y=;
int n=read();
for(int i=;i<=n;i++)
scanf("%lf",&a[i]);
int flag=; for(int i=;i<=n;i++)
{
if(fabs(a[i])>&&a[i]>)
{
Q.push_back(i);
flag=;
}
} for(int i=;i<=n;i++)
{
if(a[i]<)
{
point kiss;
kiss.x=a[i];
kiss.y=i;
T.push_back(kiss);
}
}
if(T.size()!=)
{ sort(T.begin(),T.end(),cmp);
for(int i=;i<T.size()-;i++)
{
if(T[i].x*T[i+].x>)
{
Q.push_back(T[i].y);
Q.push_back(T[i+].y);
i++;
flag = ;
}
}
}
a[]=;
if(flag)
{
int max1=,max2=;
int max3=;
for(int i=n;i>=;i--)
{
if(a[i]<)
{
if(fabs(a[i])>=fabs(a[max1]))
{
max2=max1;
max1=i;
}
else if(fabs(a[i])>=fabs(a[max2]))
{
max2=i;
}
}
else
{
if(fabs(a[i])>=fabs(a[max3]))
{
max3=i;
}
}
} if(max3==)
{
if(max2==)
Q.push_back(max1);
else
Q.push_back(max1),Q.push_back(max2);
}
else
{
if(max2==)
Q.push_back(max3);
else
{
double tmp1=a[max3],tmp2=a[max1]*a[max2];
if(tmp1-tmp2>-eps)
Q.push_back(max3);
else
Q.push_back(max1),Q.push_back(max2);
}
} }
sort(Q.begin(),Q.end());
printf("%d\n",Q.size());
for(int i=;i<Q.size();i++)
printf("%d ",Q[i]);
printf("\n");
}
Codeforces gym 100685 E. Epic Fail of a Genie 贪心的更多相关文章
- CodeForces Gym 100685E Epic Fail of a Genie (贪心,控制精度)
题意:给定 n 个数,然后让从中选取一些数使得它们的总乘积最大.如果有多个,要求这些数尽量少,如果还有多个,随便输出一组即可. 析:一个贪心题,根据乘法的性质,很容易知道,如果一个数大于1,那么肯定要 ...
- CF Gym 100685E Epic Fail of a Genie
传送门 E. Epic Fail of a Genie time limit per test 0.5 seconds memory limit per test 64 megabytes input ...
- Codeforces gym 100685 A. Ariel 暴力
A. ArielTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/A Desc ...
- Codeforces gym 100685 F. Flood bfs
F. FloodTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/F Desc ...
- Codeforces gym 100685 C. Cinderella 水题
C. CinderellaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/C ...
- codeforce Gym 100685E Epic Fail of a Genie(MaximumProduction 贪心)
题意:给出一堆元素,求一个子集,使子集的乘积最大,如有多个,应该使子集元素个数尽量小. 题解:贪心,如果有大于1的正数,那么是一定要选的,注意负数也可能凑出大于1的正数,那么将绝对值大于1的负数两两配 ...
- 程序员的Epic Fail [0]
作为程序员,我们经常会被客户问的一个问题一定是不是说很容易么,为什么花了这么长时间.不得不说,程序员可能是最糟糕的计划者,按时按点按计划完成的软件项目永远是下一个项目.一个项目的延期,有很多这样那样的 ...
- Codeforces Gym 101252D&&floyd判圈算法学习笔记
一句话题意:x0=1,xi+1=(Axi+xi%B)%C,如果x序列中存在最早的两个相同的元素,输出第二次出现的位置,若在2e7内无解则输出-1. 题解:都不到100天就AFO了才来学这floyd判圈 ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
随机推荐
- 【转】win7(windows7)下java环境变量配置方法
原文网址:http://jingyan.baidu.com/article/925f8cb836b26ac0dde0569e.html win7(windows7)下java环境变量配置方法,java ...
- HTML5 随音乐节奏变化的频谱图动画
这里将要介绍的HTML5 音频处理接口与Audio标签是不一样的.页面上的Audio标签只是HTML5更语义化的一个表现,而HTML5提供给JavaScript编程用的Audio API则让我们有能力 ...
- Linux下通过ioctl系统调用来获取和设置网络信息
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- tcprstat源码分析之tcp数据包分析
tcprstat是percona用来监测mysql响应时间的.不过对于任何运行在TCP协议上的响应时间,都可以用.本文主要做源码分析,如何使用tcprstat请大家查看博文<tcprstat分析 ...
- android电池信息简介
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- poj 1505 Copying Books
http://poj.org/problem?id=1505 Copying Books Time Limit: 3000MS Memory Limit: 10000K Total Submiss ...
- linux的文件属性介绍、目录及路径表示方法
一.认识linux文件 认识linux下的文件需要先学习命令:ls. 该命令用于显示指定目录下的内容,其中最常用的参数有: -l显示目录和文件的完整属性信息 -a显示所有文件和目录,包含隐藏文件和目录 ...
- 四款超棒的jQuery数字化签名插件
在浏览器中,我们有很多方式来绘制生成签名效果,并且有很多很棒很智能的jQuery插件.数字化签名是未来的发展方向,正是这个原因我们这里收集并且推荐了四款超棒的jQuery数字化签名插件,希望大家喜欢! ...
- 使用k-means对3D网格模型进行分割
使用k-means对3D网格模型进行分割 由于一些原因,最近在做网格分割的相关工作.网格分割的方法有很多,如Easy mesh cutting.K-means.谱分割.基于SDF的分割等.根据对分割要 ...
- C++实现网格水印之调试笔记(二)
整理了一下要实现的论文Watermarking 3D Polygonal Meshes in the Mesh Spectral Domain,步骤如下: 嵌入水印 à 提取水印 à 优化(网格细分) ...