• 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

    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
    ",Q.size());
        for(int i=0;i<Q.size();i++)
            printf("%d ",Q[i]);
        printf("
    ");
    }
  • 相关阅读:
    Jmeter之Web测试(一)
    Appium 提高脚本复用、可配置性
    Appium 解决中文输入问题
    Appium Python Driver Api
    Appium Android 屏幕滑动
    Android logcat使用
    android adb:电池与电量
    Loadrunner测试json接口
    python输出1到100之和的几种方法
    python 随机生成用户名、密码、手机号码
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4702821.html
Copyright © 2020-2023  润新知