您的位置:首页 > 大数据 > 人工智能

Gym 100685E Epic Fail of a Genie(贪心)

2016-09-01 19:52 351 查看
题目地址:http://codeforces.com/gym/100685/problem/E
思路:1.对于每个大于1的数,选择。 2.对于负数,从小到大排序,每次选择最小的两个, 若其乘积大于1,选择,否则,退出(负数其绝对值在减小,后面数一定不大于)。3.若此时选择集合为空,则比较最小的两个负数乘积(此时正数中全部小于1,相乘后变小)与整个数列最大的数,选择其中最大的。

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ft first
#define sd second
#define PII pair<int,int>
using namespace std;
typedef long long LL;
vector<PII> a;
int n,pos,maxx;
vector<int> ans;
int main()
{
maxx=-1e9;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
double x;
scanf("%lf",&x);
int tmp=x*100;
if(tmp>100) ans.push_back(i);
else
{
if(tmp>maxx)
{
maxx=tmp;
pos=i;
}
a.push_back(PII(tmp,i));
}
}
sort(a.begin(),a.end());
for(int i=1; i<a.size()&&a[i].ft<0&&a[i-1].ft<0&&(LL)a[i].ft*a[i-1].ft>10000; i+=2)
{
ans.push_back(a[i].sd);
ans.push_back(a[i-1].sd);
}
if(!ans.size())
{
if(a[0].ft*a[1].ft>maxx*100)
{
ans.push_back(a[0].sd);
ans.push_back(a[1].sd);
}
else ans.push_back(pos);
}
sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
for(int i=0; i<ans.size()-1; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[ans.size()-1]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Gym 贪心