zoukankan      html  css  js  c++  java
  • [CF798C] Mike and gcd problem(规律,gcd)

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

    题意:给n个数,和一种操作:把a(i)和a(i+1)变成a(i)-a(i+1)和a(i)+a(i+1)。问能不能把整个数列变成gcd>1,能的话输出最少步骤。

    贪心地认为假如需要这种操作,那么gcd为2是最好的。

    进行操作无非四种情况:奇奇 奇偶 偶奇 偶偶。奇偶和偶奇可以看成一种情况,而偶偶则不需要进行操作。只剩下奇奇。

    进行一次操作后,会发现奇奇会变成偶偶。

    再看奇偶,奇偶进行一次会变成奇奇,再进行一次就是偶偶。

    那么先把奇奇的处理了,再找奇偶,偶奇的情况就行了。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn = 100100;
     5 int n, a[maxn];
     6 
     7 int main() {
     8     // freopen("in", "r", stdin);
     9     while(~scanf("%d", &n)) {
    10         int g = 0;
    11         for(int i = 1; i <= n; i++) {
    12             scanf("%d", &a[i]);
    13             g = __gcd(g, a[i]);
    14             if(a[i] & 1) a[i] = 1;
    15             else a[i] = 0;
    16         }
    17         if(g != 1) {
    18             puts("YES
    0");
    19             continue;
    20         }
    21         int ret = 0;
    22         for(int i = 1; i < n; i++) {
    23             if(a[i] && a[i+1]) {
    24                 a[i] = a[i+1] = 0;
    25                 ret++;
    26             }
    27         }
    28         for(int i = 1; i <= n; i++) {
    29             if(a[i]) ret += 2;
    30         }
    31         printf("YES
    %d
    ", ret);
    32     }
    33 }
  • 相关阅读:
    鱼眼拼接实验
    多字节字符集 unicode字符集
    GPU编程接口
    零基础学java第一天
    最牛的减肥方法
    近期思考
    c++的stl容器
    蓝桥杯历年穷举题
    git简单指令3
    git简单指令2
  • 原文地址:https://www.cnblogs.com/kirai/p/6872822.html
Copyright © 2011-2022 走看看