Codeforces 798C:Mike and gcd problem
Codeforces 798C:Mike and gcd problem
题目链接:http://codeforces.com/contest/798/problem/C
题目大意:给出一个大小为$n$的数列,每次操作可以使得$a_i=a_i-a_{i+1}$,$a_{i+1}=a_i+a_{i+1}$,问最少多少次操作可以使得$gcd\{a_i\}>1$.
dp
考虑$gcd(x,y)=1$的情况:若有$d \neq 1$,$d|x-y$且$d|x+y$,则有$d|2x$且$d|2y$,故$d=2$,也就是说$gcd(x-y,x+y)=1$或$2$.
故若对于初始数列$gcd\{a_i\}=1$,那么多次操作后得到$gcd\{a_i\}=2$.
于是问题就转化为了,将数列中所有元素变成偶数所需要的最少操作数.
可以用dp解决(好像用贪心也是可以的).
定义状态:
- $dp[i][1]$为前$i-1$个数均为偶数,第$i$个数为奇数的最少操作数;
- $dp[i][0]$为前$i-1$个数均为偶数,第$i$个数为偶数的最少操作数.
则有四种情况:
- 第$i$个数为偶数,第$i+1$个数为偶数时,将第$i+1$个数变成偶数不需要进行操作,而无法使第$i+1$个数变成奇数;
- 第$i$个数为偶数,第$i+1$个数为奇数时,将第$i+1$个数变成偶数需要进行$2$次操作,将第$i+1$个数变成奇数不需要进行操作;
- 第$i$个数为奇数,第$i+1$个数为偶数时,将第$i+1$个数变成偶数需要进行$2$次操作,而无法使第$i+1$个数变成奇数;
- 第$i$个数为奇数,第$i+1$个数为奇数时,将第$i+1$个数变成偶数需要进行$1$次操作,而无法使第$i+1$个数变成奇数;
复杂度为$O(nlg(Max\{a_i\}))$.
代码如下:
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <string> 5 #define N 100005 6 using namespace std; 7 typedef long long ll; 8 int inf=10000000; 9 int n,a[N],ans,dp[N][2]; 10 bool p[N]; 11 int gcd(int a,int b){ 12 return b==0?a:gcd(b,a%b); 13 } 14 int main(void){ 15 scanf("%d",&n); 16 for(int i=0;i<n;++i){ 17 scanf("%d",&a[i]); 18 p[i]=a[i]%2; 19 } 20 ans=a[0]; 21 for(int i=0;i<n;++i)ans=gcd(ans,a[i]); 22 if(ans==1){ 23 dp[0][!p[0]]=inf; 24 for(int i=1;i<n;++i){ 25 if(p[i]){ 26 dp[i][0]=min(dp[i-1][0]+2,dp[i-1][1]+1); 27 dp[i][1]=min(dp[i-1][0],inf); 28 }else{ 29 dp[i][0]=min(dp[i-1][0],dp[i-1][1]+2); 30 dp[i][1]=min(inf,inf); 31 } 32 } 33 if(dp[n-1][0]!=inf)printf("YES\n%d",dp[n-1][0]); 34 else printf("NO"); 35 }else printf("YES\n0"); 36 }
转载于:https://www.cnblogs.com/barrier/p/6747464.html
Codeforces 798C:Mike and gcd problem相关推荐
- 【Codeforces - 798C】 Mike and gcd problem(思维,贪心)
题干: Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the sequence B = [b1, b2, .. ...
- G - Mike and gcd problem
G - Mike and gcd problem Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the seq ...
- codeforces798C - Mike and gcd problem (数论+思维)
原题链接:http://codeforces.com/contest/798/problem/C 题意:有一个数列A,gcd(a1,a2,a3...,an)>1 时称这个数列是"漂亮& ...
- Mike and gcd problem(思维)
Mike has a sequence A = [a1, a2, -, an] of length n. He considers the sequence B = [b1, b2, -, bn] b ...
- Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 离散化】
任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...
- CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)
CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...
- 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- Codeforces 768E:Game of Stones
Codeforces 768E:Game of Stones 题目链接:http://codeforces.com/contest/768/problem/E 题目大意:给定$n$堆石子,初始每堆$s ...
- 【CodeForces - 798A】Mike and palindrome (回文串,水题,字符串问题)
题干: Mike has a string s consisting of only lowercase English letters. He wants to change exactly one ...
最新文章
- 13张图彻底搞懂分布式系统服务注册与发现原理
- 动手学深度学习(二)
- PHP_define和const的区别/获取所有常量get_defined_constant()
- 华为云平台使用手册_华为云首发全生命周期应用平台,四大能力解决政企上云五大难题...
- Ubuntu16.04换源
- Github入门详情教程
- eclipse搭建maven开发环境
- Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型
- 【马哥教育视频】cacti入门及进阶[已更新至第四段]
- Spark Architecture
- PCIe协议在具体实现时的大体框图
- OC, OD门和线与逻辑
- 频繁切换网卡,一款快速设置IP地址的工具,爽到爆。
- 本科生学习的一些心得
- 1038: 顺序表中重复数据的删除
- 在移动硬盘里移动视频文件到移动硬盘 另外一个文件夹 显示正在计算_移动硬盘也支持AES-256位硬件加密,希捷锦系列入手体验...
- linux通过xdm开启端口,Red Hat Linux 5.4 开启xdm远程访问
- python正则表达式(关于提取数字)
- Word2Vec+ Word Embedding
- java计算机毕业设计黑格伯爵国际英语贵族学校官网MyBatis+系统+LW文档+源码+调试部署