B. Array Reodering

https://codeforces.com/contest/1535/problem/B
贪心
在这里插入图片描述input

3
4
3 6 5 3
2
1 7
5
1 4 2 4 1

output

4
0
9

在这里插入图片描述
题意
给T,循环T遍,给n,给n个数,, 你可以随意排序
然后定义一个好的pair为在 1 <= i <= j <= n中 gcd(ai,2aj)>1
求某排序中存在的最大pair数

以第三个例子解释

1 4 2 4 1
排序成:
4 4 2 1 1
pair:
44 、 42 、 41 、 41 、 42 、 41 、 41 、 21 、 21

思路:
我们发现当一个偶数在前的时候,这个偶数与之后的任意一个数都能成pair
比如:4 1 2 3中4能和1 2 3都能成pair
所以只要把偶数揪出来丢前面,然后再加上搜索奇数中能gcd>1的(这里奇数中比较不用让后者乘以二(2aj),因为都是奇数对gcd没有影响)就是最大的pair数了
答案就是
1.偶数逐减相加(不懂表达),比如n == 10,偶数为4,即9+8+7+6
2.最后加上奇数中成立的pair数。

gcd函数:

int gcd(int a,int b)
{
	return b == 0 ? a : gcd(b,a % b);
}

AC 代码

#include<bits/stdc++.h>
using namespace std;

int gcd(int a,int b)
{
	return b == 0 ? a : gcd(b,a % b);
}

int main()
{
	int T,n;
	int e[100005];
	cin>>T;
	while(T--)
	{
		cin>>n;
		int a,cnt = 0,even = 0,ans = 0;
		for(int i = 1;i<=n;i++)
		{
			cin>>a;
			if(a % 2 ==0)
			{
				even++;
			}
			else
			{
				cnt++;
				e[cnt] = a;
			}
		}
		for(int i = 1;i<=even;i++)
		{
			ans += n-i;
		}
		for(int i = 1;i<=cnt;i++)
			for(int j = i+1;j<=cnt;j++)
			{
				if((gcd(e[i],e[j]) > 1) && (e[i] != 1 && e[j] != 1))
				{
					ans++;
				}
			}
		cout<<ans<<endl;
	}
	return 0;
}

如有问题请指正,虚心受教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值