zoukankan      html  css  js  c++  java
  • Codeforces 798C

    题目链接:http://codeforces.com/problemset/problem/798/C

    题意:给你n个数,a1,a2,....an。要使得gcd(a1,a2,....an)>1,可以执行一次操作使ai,ai+1变为ai - ai + 1, ai + ai + 1。求出使得gcd(a1,a2,....an)>1所需要的最小操作数。

    解题思路:首先,要知道如果能够实现gcd(a1,a2,....an)>1,那么a1~an肯定都是偶数(0也是偶数),所以我们的目的就是用最少的操作次数把所有数变成偶数。如果两个数都是奇数,那需要操作一次(奇数加减变成偶数),如果是偶数和奇数,那需要操作两次(奇数和偶数加减得到奇数,奇数再和奇数加减得到偶数),所以不存在gcd不能大于1的情况

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int N=1e5+5;
     5 int gcd(int a,int b){
     6     return b==0?a:gcd(b,a%b); 
     7 }
     8 
     9 int main(){
    10     int n,tmp=0;
    11     int a[N]={0};
    12     cin>>n;
    13     for(int i=1;i<=n;i++){
    14         cin>>a[i];
    15         tmp=gcd(tmp,a[i]);
    16     }
    17     if(tmp!=1)//如果不需要操作就得到gcd>1,直接输出0次;
    18         cout<<"YES"<<"
    "<<"0"<<endl;
    19     else{
    20         int ans=0;
    21         for(int i=1;i<n;i++){//找奇奇 
    22             if(a[i]&1&&a[i+1]&1){
    23                 ans++;
    24                 a[i]=a[i+1]=2; 
    25             }
    26         }
    27         for(int i=1;i<n;i++){
    28             if(a[i]&1||a[i+1]&1){//找奇偶或者偶奇 
    29                 ans+=2;
    30                 a[i]=a[i+1]=2;
    31             }
    32         }
    33         cout<<"YES"<<endl;
    34         cout<<ans<<endl;
    35     }
    36     return 0;
    37 }
    38 
    39  

    。因为要求的最小操作数,所以我们要先找奇奇的情况,再找奇偶或者偶奇的情况。

  • 相关阅读:
    bzoj3272 Zgg吃东西
    bzoj3894 文理分科
    poj1149 PIGS
    poj1637 Sightseeing tour
    [Wc2007]剪刀石头布
    poj2396 Budget
    [NOI2017]游戏
    CF666E Forensic Examination
    bzoj4889 [Tjoi2017]不勤劳的图书管理员
    CF587F Duff is Mad
  • 原文地址:https://www.cnblogs.com/fu3638/p/6754043.html
Copyright © 2011-2022 走看看