您的位置:首页 > 其它

codeforces 798C - Mike and gcd problem 贪心

2017-05-24 10:57 609 查看
题意:如果一个序列B={b1,b2,b3,…,bn},其gcd(b1,b2,b3...bn)>1则称之为漂亮的。
现在给定一个长度为序列和一个操作,选定一个i(0<=i<n),分别用ai-ai+1,ai+ai+1代替原来的ai,ai+1。问最少操作几次,使得序列成为一个漂亮的序列(2<=n<=1e5)
思路:d|(a−b)
&& d|(a+b)
-> d|2a
&& d|2b
所以要将 gcd(ai)=1
转化成 gcd(ai)=2


一对奇数操作一次,即可变为偶数,一奇一偶要两个次。相邻两个都是奇数时,那么优先选择这两个数操作。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int d=__gcd(a[0],a[1]);

int ans=0;
for(int i=0;i<n;i++)
{
d=__gcd(d,a[i]);
if((a[i]&1)&&(a[i+1]&1))
{
i++;
ans++;
continue;
}
if(a[i]&1)ans+=2;
}
if(d!=1)printf("YES\n0\n");
else printf("YES\n%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: