mine code
#include<bits/stdc++.h>
#define int long long
#define fast register int
using namespace std;
const int N=1e5+100;
int n,m,t,cnt=0,flag[N];
struct node{
int id;
double val;
}a[N*10];
bool cmp(node a,node b){
return a.val<b.val;
}
int maxx(int a,int b,int c){
if (a!=max(a,max(b,c))&&a!=min(a,min(b,c))) return a;
else if (b!=max(a,max(b,c))&&b!=min(a,min(b,c))) return b;
else if (c!=max(a,max(b,c))&&c!=min(a,min(b,c))) return c;
}
signed main(){
cin>>t;
while (t--){
int ans=0;
cnt=0;
scanf("%lld",&n);
memset(flag,0,sizeof(flag));
for (fast i=1;i<=n;i++){
cin>>a[i].val;
if (a[i].val<0){
cnt++;
}
a[i].id=i;
}
if (n==1){
cout<<1<<endl<<1<<endl;
continue;
}
sort(a+1,a+n+1,cmp);
if (a[n].val<1&&a[1].val>-1){
double sum=a[n].val,sum1=-0x3ffff,sum2=-0x3ffff;
if (cnt>=2){
sum1=a[1].val*a[2].val;
sum2=sum1*sum;
}
if (sum>sum1&&sum>sum2) cout<<1<<endl<<a[n].id<<endl;
else if (sum1>sum2&&sum1>sum) cout<<2<<endl<<min(a[1].id,a[2].id)<<" "<<max(a[1].id,a[2].id)<<endl;
else if (sum2>sum1&&sum2>sum) cout<<3<<endl<<min(a[1].id,min(a[2].id,a[n].id))<<" "<<maxx(a[1].id,a[2].id,a[n].id)
<<" "<<max(a[1].id,max(a[2].id,a[n].id))<<endl;
continue;
}
for (fast i=2;i<=cnt;i+=2){
if (abs(a[i].val)>=1+1e-6&&abs(a[i-1].val)>=1+1e-6){
ans+=2;
flag[a[i].id]=1;
flag[a[i-1].id]=1;
}
}
for (fast i=cnt+1;i<=n;i++){
if (abs(a[i].val)>=1+1e-6){
ans++;
flag[a[i].id]=1;
}
}
cout<<ans<<endl;
for (fast i=1;i<=n;i++){
if (flag[i]==1){
cout<<i<<" ";
}
}
cout<<endl;
}
return 0;
}
/*
1
7
-0.2 -0.3 -0.1 0.1 0.2 0.3 0.1111
*/
题解 code
#include <bits/stdc++.h>
using namespace std;
int a[10005];
bool flag[10005];
struct tt{
double a;
int pos;
} t[10005];
bool cmp(tt a, tt b){
return a.a < b.a;
}
int main(){
int m,cas,n,k;
cin>>cas;
while (cas--){
memset(a, 0, sizeof(a));
memset(flag, 0, sizeof(flag));
memset(t, 0, sizeof(t));
cin>>n;
for (int i=1;i<=n;i++){
cin>>t[i].a;
t[i].pos=i;
}
sort(t+1,t+n+1,cmp);
int cnt = 0;
for (int i=1;i<=n;i++){
if (t[i].a<0)cnt++;
}
for (int i=1;i<=cnt;i++){
if (!flag[i]){
if (t[i].a * t[i + 1].a > 1 + 1e-6){
flag[i]=true;
flag[i+1]=true;
}
}
}
for (int i=cnt;i<=n;i++){
if (t[i].a >1+1e-6){
flag[i]=true;
}
}
cnt=0;
for (int i=1;i<=n;i++){
if (flag[i]){
cnt++;
a[cnt]=t[i].pos;
}
}
sort(a+1,a+cnt+1);
if (cnt==0){
if (n==1){
cout<<1<<endl<<1<< endl;
}
else{
double tmp=t[1].a*t[2].a;
double tmp2=t[n].a;
if (tmp>tmp2+1e-6){
int a=t[1].pos;
int b=t[2].pos;
if (a>b)cout<<2<<endl<<b<<" "<<a<<endl;
else cout<<2<<endl<<a<<" "<<b<<endl;
}
else cout<<1<<endl<<t[n].pos<<endl;
}
}else {
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
return 0;
}
题面
yjq获得了—个实数集合,他需要在这个集合中选择若干个数(至少—个,不能不选)使得他们的乘积尽量大,他不知道怎么办,所以请你来帮忙,请你告诉他需要选几个数,选哪几个数。
第一行输入一个数字 T,表示有 T 组数据。
每行数据的第一行为一个整数 n 表示集合中数字的个数。 接下来一个的 n 个实数,为集合中的数。
每组数据的输出占两行。
第一行为最终要选择的数字个数k。
之后一行输出k个数,为要选择的数字的编号,此处从小往大输出。
注:为了保证没有多解,集合保证不会出现数字1和-1。
2
3
0.355 1.2 5
3
-1.23 -2.22 3.14
2
2 3
3
1 2 3
对于100%的数据:1≤T≤20,1≤n≤104,0.00001≤∣ai∣≤105