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=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(" "); }