求助,玄关
  • 板块灌水区
  • 楼主fluhang_
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/9/14 16:30
  • 上次更新2024/9/14 21:03:23
查看原帖
求助,玄关
1072112
fluhang_楼主2024/9/14 16:30

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;
}

题面

实数集合(real.cpp)

题目描述

yjq获得了—个实数集合,他需要在这个集合中选择若干个数(至少—个,不能不选)使得他们的乘积尽量大,他不知道怎么办,所以请你来帮忙,请你告诉他需要选几个数,选哪几个数。

输入格式

第一行输入一个数字 TT,表示有 TT 组数据。

每行数据的第一行为一个整数 nn 表示集合中数字的个数。 接下来一个的 nn 个实数,为集合中的数。

输出格式

每组数据的输出占两行。

第一行为最终要选择的数字个数kk

之后一行输出kk个数,为要选择的数字的编号,此处从小往大输出。

注:为了保证没有多解,集合保证不会出现数字1和-1。

样例 #1

样例输入 #1

2
3
0.355 1.2 5
3
-1.23 -2.22 3.14

样例输出 #1

2
2 3
3
1 2 3

提示

数据范围及约定

对于100%100\%的数据:1T201 \le T \le 201n1041 \le n \le 10^40.00001ai1050.00001 \le \vert ai \vert \le 10^5

2024/9/14 16:30
加载中...