codeforce Gym 100685E Epic Fail of a Genie(貪心)

來源:互聯網
上載者:User

標籤:

題意:給出一堆元素,求一個子集,使子集的乘積最大,如有多個,應該使子集元素個數盡量小。

題解:貪心,如果有乘積大於1的正數,那麼是一定要選的,注意負數也可能湊出大於1的正數,那麼將絕對值大於1的負數兩兩配對,如果還剩下一個,那麼在判斷一下,那個負數和比它小的最小負數的乘積是否大於1,如果是那麼就選這兩個。把所有可能湊成大於1的數選完以後,剩下的數一定比1小,那麼就不選。

如果無法湊出大於1的數,那麼再分類討論一下。

挺容易寫錯。。。

#include<bits/stdc++.h>using namespace std;const int maxn = 1e4+6;struct Num{    int a[maxn];    int id[maxn];    int r[maxn];    int sz;    Num(){sz = 0;}    void push(double x,int i){        a[sz] = x*100;        r[sz] = sz;        id[sz] = i;        sz++;    }    int _upper_bound(int L,int R,int v)    {        while(L<R){            int m = (L+R)>>1;            if(a[r[m]]>v) R = m;            else L = m+1;        }        return L;    }    int _lower_bound(int L,int R,int v)    {        while(L<R){            int m = (L+R)>>1;            if(a[r[m]]>=v) R = m;            else L = m+1;        }        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(0,which.sz,v);r = which._upper_bound(0,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 = 1; i <= n; i++){        double t;        scanf("%lf",&t);        if(t>0){            P.push(t,i);        }else if(t<0){            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,100,M)    GetBound(p1l,p1r,100,P)    int sz = 0;    int t;    for(t = p1r; t < P.sz; t++) Add(P,t)    int odd = (M.sz - m1r)&1;    for(t = m1r+odd; t < M.sz; t++) Add(M,t)    if(odd){        if(m1r>0 && M[m1r]/10000.*M[m1r-1] > 1 ) { Add(M,m1r) Add(M,m1r-1)  }    }    if(!sz){        int psz = P.sz, msz = M.sz;        if(psz){            if(msz>=2 && M[msz-1]*M[msz-2] > P[psz-1]*100 ){                Add(M,msz-1) Add(M,msz-2)            }else { Add(P,psz-1) }        }else {            if(msz>=2){                Add(M,msz-1) Add(M,msz-2)            }else ans[sz++] = pzero;        }    }    sort(ans,ans+sz);    printf("%d\n%d",sz,ans[0]);    for(int i = 1; i < sz; i++) printf(" %d",ans[i]);    putchar(‘\n‘);    return 0;}

 

codeforce Gym 100685E Epic Fail of a Genie(貪心)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.