题目描述
可爱的小喵获取到了一个实数的集合,此刻的他陷入了迷茫,因为他需要从这个集合里精心挑选出若干个数(至少要选一个,绝不能不选),从而让这些数的乘积达到最大。他感到不知所措,于是向您求助,期望您能告诉他应当选取几个数,以及具体是哪几个数。
输入格式
首先,输入一个数字 T ,它代表着数据的组数。
对于每一组数据,开头是一个整数 n ,用以表明集合中数字的数量。
紧接着的一行,会有 n 个实数,它们共同构成了集合中的元素。
输出格式
每组数据的输出占据两行。
第一行,呈现的是最终需要选择的数字个数 k 。
随后的一行,输出 k 个数,按照从小到大的顺序输出所选取数字的编号。并且可以保证,答案是唯一的。
Input1 复制代码
2
3
0.355 1.2 5
3
-1.23 -2.22 3.14
Output1 复制代码
2
2 3
3
1 2 3
样例解释
在第一组数据中,选择两个数,即第二个和第三个。
在第二组数据里,选取三个数,分别是第一个、第二个和第三个。
数据范围
对于 20% 的数据:1 ≤ n ≤ 20 ,10^(-5) ≤ |a_i| ≤ 10^5
另外有 10% 的数据:1 ≤ n ≤ 10^4 ,10^(-5) ≤ |a_i| ≤ 10^5 ,同时保证集合中所有的数都是正数。
对于 100% 的数据:1 ≤ n ≤ 10^4 ,10^(-5) ≤ |a_i| ≤ 10^5 ,1 ≤ T ≤ 20
代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,cnt1,cnt2,cnt3,tmp,tmpn,ans[1000010];
struct node{
int num;
double q;
}a[1010],b[1010];
bool cmp(node a,node b){
return a.q<b.q;
}
int main(){
cin>>t;
while(t--){
cin>>n;
cnt1=cnt2=cnt3=0;
tmp=0;
for(int i=1;i<=n;i++){
double x;
cin>>x;
if(x<0){
b[++cnt2].q=x;
b[++cnt2].num=i;
}else if(x==0){
tmp=1;
tmpn=i;
}else{
a[++cnt1].q=x;
a[++cnt1].num=i;
}
}
sort(a+1,a+1+cnt1,cmp);
sort(b+1,b+1+cnt2,cmp);
for(int i=cnt1;i>=1;i--){
if(a[i].q<1){
break;
}
ans[++cnt3]=a[i].num;
}
for(int i=1;i<cnt2;i+=2){
if(b[i].q*b[i+1].q<1){
break;
}
ans[++cnt3]=b[i].num;
ans[++cnt3]=b[i+1].num;
}
if(cnt3==0){
if(a[cnt1].q>b[1].q*b[2].q){
cout<<a[cnt1].num<<endl;
}else{
cout<<min(b[1].num,b[2].num)<<" "<<max(b[1].num,b[2].num)<<endl;
}
}else{
sort(ans+1,ans+1+cnt3);
for(int i=1;i<=cnt3;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
}
return 0;
}
有点呗桑,未过样例