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;
}
如有问题请指正,虚心受教