首页 > 其他分享 >Codeforces 891 A. Pride 做题记录(DP)

Codeforces 891 A. Pride 做题记录(DP)

时间:2022-12-30 18:33:11浏览次数:71  
标签:891 gcd int Codeforces 序列 操作 变成 Pride

  原题链接:https://codeforces.com/problemset/problem/891/A

  一个比较显然的性质是如果序列的总$gcd$不为$1$,那么肯定是不存在解的。因为不管怎么样,都有一个因子无法消掉。

  单操作能让最多一个数变成$1$。很容易想到最好的情况就是每次操作都有一个数变成$1$。而在序列中存在$1$的情况下,每次操作都有一个数变成$1$是可以实现的($1$不断使旁边的数也变成$1$)。因此在序列中存在$cnt$个$1$的情况下,答案就是$n-cnt$。

  如果序列中没有$1$呢?只要序列的总$gcd$为$1$,我们就可以创造出$1$。对于创造$1$有几种情况:

  1)  序列中已经存在至少一对相邻数,它们的$gcd$是$1$。我们这样就只需要$1$次操作就能让序列中出现$1$。

  2)  序列中每一对相邻数,它们的$gcd$都不是$1$(但是序列的总$gcd$是$1$)。例如序列:$2$,$6$,$15$,$35$。这时我们不能$1$次操作就让序列中出现$1$。可以考虑枚举寻找序列中最少操作就能变成$1$的数,这个复杂度会达到$O(n^2)$,但是我们看数据规模才$2000$,复杂度可以接受。

  最终代码:

 

#include <cstdio>
using namespace std;
const int maxn=2000;
const int inf=0x3fffffff;

int n;
int a[maxn+5];

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

int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int g=a[1],cnt=0;
    bool flag=0;
    for (int i=1;i<=n;i++){
        if (g!=1)
            g=gcd(g,a[i]);
        if (a[i]==1)
            cnt++;
        if (gcd(a[i],a[i-1])==1)
            flag=1;
    }
    if (g!=1)
        puts("-1");
    else if (cnt||flag)
        printf("%d",n-cnt);
    else{
        int ans=inf;
        for (int i=1;i<=n;i++){
            g=a[i];
            for (int j=i+1;j<=n;j++){
                g=gcd(g,a[j]);
                if (g==1){
                    ans=(ans>j-i)?(j-i):ans;
                    break;
                }
            }
        }
        printf("%d",ans+n-1);
    }
    return 0;
} 

 

标签:891,gcd,int,Codeforces,序列,操作,变成,Pride
From: https://www.cnblogs.com/wegret/p/17014758.html

相关文章

  • Codeforces Round #838 (Div. 2) A-B,补C,D
    A.DivideandConquer题意:给定n个数,每次操作可以使得:$$\lfloor\frac{ai}{2}\rfloor$$,求最少的操作次数使得n个数的总和为偶数。分析:和为偶数,res=0和为奇数,暴力......
  • Codeforces 1253 C. Sweets Eating 做题记录(DP)
    很明显,贪心策略是先吃甜度大的可以保证最终的总甜度最小,因此我们先从小到大排个序。一天可以吃$m$个,因此我们对于每个$k$,就让甜度前$1~m$名在第一天吃,前$m+1~2m$名第二......
  • [Codeforces Round #841]
    [CodeforcesRound#841]CodeforcesRound#841(Div.2)andDividebyZero2022A.JoeyTakesMoneyJoeyTakesMoneProblem:给一个正整数序列\(a_1,a_2,…,a_n(n......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #690 (Div. 3) E1. Close Tuples (easy version) (贪心+思维)
    https://codeforces.com/contest/1462/problem/E1E1.CloseTuples(easyversion)题目大意:给定一个长度为n的序列a,由1到n的整数组成,某些元素可能相等。找出m=3个元......
  • Codeforces 1336 F Journey 题解
    题目链接这题的方法口糊一下没有很难,没达到3500的水准。但是写起来才发现是真的恶心(主要是容易写错),没写过这么累的题,可能难度就体现在这里吧。计数的时候是要分类讨论......
  • Codeforces Round #766 (Div. 2)C,D
    CodeforcesRound#766(Div.2)C,D今天A竟然看错了,还好后来发现了,A题就写了40几分钟,真有你的过了B,排名是8千多,比前几天好一点,加油ヾ(◍°∇°◍)ノ゙CC相比于D,我更没有......
  • Codeforces Round #764 E
    E.Masha-forgetful题链结论就是任何长的串都可以被2,3长度的串表示后面就是暴力hash和很常规的dp[i]表示前i个是否匹配了voidsolve(){intn,m;cin>>n>>m;tu......
  • CodeForces 1163D Mysterious Code
    洛谷传送门CF传送门zxx的题单来的(发一个无脑kmp自动机+dp做法。看到题就很dp,考虑设计状态。显然填字母时要知道当前串与\(s,t\)的匹配位数,否则就不知道\(s,......
  • Codeforces 随机补题记录
    日期序号题号点评12.2029CF1694E很有借鉴意义的化用算法题12.2138CF1713F子集启蒙题12.2954CF1761E有很多细节,要想清楚,下次不要面向数据编程了......