rt
  • 板块灌水区
  • 楼主lucy2012
  • 当前回复51
  • 已保存回复51
  • 发布时间2024/8/18 16:16
  • 上次更新2024/8/18 19:16:54
查看原帖
rt
1252442
lucy2012楼主2024/8/18 16:16

题目描述

可爱的小喵获取到了一个实数的集合,此刻的他陷入了迷茫,因为他需要从这个集合里精心挑选出若干个数(至少要选一个,绝不能不选),从而让这些数的乘积达到最大。他感到不知所措,于是向您求助,期望您能告诉他应当选取几个数,以及具体是哪几个数。

输入格式

首先,输入一个数字 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;
}

有点呗桑,未过样例

2024/8/18 16:16
加载中...