Codeforces1042C-Array Product


题解:
贪心,如果负数有奇数个,则将绝对值最小的那个负数变成0,然后把0乘起来最后删掉0。
把剩下的数乘起来即可。

#include<bits/stdc++.h>
const int N=2e5+5;
const int inf=1e9+5;
using namespace std;
int n,cnt2,a[N],cnt1,t;
pair<int,int> mn;
int main()
{
	scanf("%d",&n);
	mn=make_pair(inf,0);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]==0)cnt1++;
		if(a[i]<0)
		{
			cnt2++;
			mn=min(mn,make_pair(-a[i],i));
		}
	}
	if(cnt2&1)a[mn.second]=0;
	int k=-1;
	for(int i=1;i<=n;i++)
	{
		if(a[i]!=0)continue;
		if(k==-1)k=i;else
		{
			printf("%d %d %d\n",1,k,i);
			k=i;t++;
		}
	}
	if(k!=-1&&t<n-1)printf("%d %d\n",2,k);
	k=-1;
	for(int i=1;i<=n;i++)
	{
		if(a[i]==0)continue;
		if(k==-1)k=i;else
		{
			printf("%d %d %d\n",1,k,i);
			k=i;
		}
	}
	return 0;
}
发布了232 篇原创文章 · 获赞 463 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_34531807/article/details/82824585
今日推荐