码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces gym 100685 E. Epic Fail of a Genie 贪心

时间:2015-08-04 20:38:08      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:

E. Epic Fail of a Genie
Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://codeforces.com/gym/100685/problem/E

Description

Aladdin had found a new shiny lamp and has started polishing it with his hands. Suddenly a mysterious genie appeared from within and offered Aladdin to fulfill any of his three wishes. Genie had a very subtle humor that made Aladdin very sceptical about him. Aladdin didn‘t believe that genie was so powerful that could do anything he had wished and asked him to become a mouse. The genie did that without hesitation. Then Aladdin asked genie to become a mouse pad. Genie didn‘t like this kind of wish but had to submit. Finally Aladdin tested genie‘s abilities in math: he had to choose a nonempty subset giving the maximum product from the given set of numbers. Genie was shocked. Math was his Achilles‘ heel, however he was able to contact anyone on earth to help him. You are a secret weapon of the genie — help him solve the test and avoid this epic fail. This is the last chance for the genie: he‘ll be forever jailed in the lamp if his new master doesn‘t trust him.

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=0,f=1;char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0;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=0,tmp.y=0;
    int n=read();
    for(int i=1;i<=n;i++)
        scanf("%lf",&a[i]);
    int flag=1;
    
    for(int i=1;i<=n;i++)
    {
        if(fabs(a[i])>1&&a[i]>0)
        {
            Q.push_back(i);
            flag=0;
        }
    }
    
    for(int i=1;i<=n;i++)
    {
        if(a[i]<0)
        {
            point kiss;
            kiss.x=a[i];
            kiss.y=i;
            T.push_back(kiss);
        }
    }
    if(T.size()!=0)
    {
    
        sort(T.begin(),T.end(),cmp);
        for(int i=0;i<T.size()-1;i++)
        {
            if(T[i].x*T[i+1].x>1)
            {
                Q.push_back(T[i].y);
                Q.push_back(T[i+1].y);
                i++;
                flag = 0;
            }
        }
    }
    a[0]=0;
    if(flag)
    {
        int max1=0,max2=0;
        int max3=0;
        for(int i=n;i>=1;i--)
        {
            if(a[i]<0)
            {
                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==0)
        {
            if(max2==0)
                Q.push_back(max1);
            else
                Q.push_back(max1),Q.push_back(max2);
        }
        else
        {
            if(max2==0)
                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=0;i<Q.size();i++)
        printf("%d ",Q[i]);
    printf("\n");
}

 

Codeforces gym 100685 E. Epic Fail of a Genie 贪心

标签:

原文地址:http://www.cnblogs.com/qscqesze/p/4702821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!