欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【EOJ Monthly 2018.10 - B】 莫干山奇遇 (思维构造,数学,数组,贪心)(总结)

发布时间:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【EOJ Monthly 2018.10 - B】 莫干山奇遇 (思维构造,数学,数组,贪心)(总结) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题干:

Time limit per test: 2.0 seconds

Memory limit: 512 megabytes

出题人当然是希望出的题目有关 oxx,于是想方设法给题目配上一些有关 oxx 的背景故事,使得它看起来不那么无趣。但有的时候却无法引入合适的小姐姐,使得 oxx 显得非常可怜。所以出题人删除了故事,只留下一个枯燥乏味的数学问题。

【故事已删除】

给一个长度为 n 的序列 a1,a2,…,an ,求一个长度为 m 的序列 b1,b2,…,bm 使得:

  • a1,a2,…,an 是 b1,b2,…,bm 的子序列(不一定连续),且
  • 存在常数 p>0 使得 b1,b2,…,bm 是一个 p -莫干山序列。

序列 s1,s2,…,sn 是 p -莫干山序列,当且仅当:存在 0≤x<p 对于 1≤i≤n 满足 si=(x+i)modp 。

求 m 的最小值。

Input

第一行一个整数 n (1≤n≤2⋅105 )。

第二行 n 个整数用空格隔开 a1,a2,…,an (0≤ai≤109 )。

Output

输出最小的 m 。

Examples

Input

2 0 2

Output

3

Input

3 0 2 0

Output

4

Input

1 0

Output

1

Input

10 0 1 2 3 5 6 7 8 9 1000000000

Output

1000000001

Input

3 0 1 2

Output

3

Note

样例 1: [0, 1, 2].

样例 2: [0, 1, 2, 0].

样例 3: [0].

 

解题报告:

首先注意到 p 的取值应该就是 max(ai)+1 。然后相邻两项之间贪心地填东西。答案就是

下面给出证明:

   显然可以注意到,p越大,需要填的数就会越多,相应的,m就越大,所以我们需要让p越小越好,下界是多少呢?因为我们需要可以表示出所有的ai啊!!所以p肯定要大于max(ai),于是乎令p=max(ai)+1是正解。

   其次,x的取值,因为题目说存在一个x,使对于任意的i、、、说明确定了x之后,就不再改变了。(想想如果是对于任意的i,都存在一个x,如果这样叙述的话?、、、这题就简单多了貌似)一般这种存在性构造问题,都是构造的值令第一个值(a1)是最优的,为最优解。所以我们令x=(a1) -1。对于这个题也只能是让第一个值是最优的,因为可以证明,每两个数之间要插入的数字的个数都是相同的。于是p、x这两个值都被我们得到了,这个题也就自然而然解决了。

AC代码:

#include<bits/stdc++.h> #define ll long long using namespace std; const int MAX = 2e5 +5; ll a[MAX]; int main() {int n;ll maxx = -1;cin>>n;for(int i = 1; i<=n; i++) {scanf("%lld",a+i);maxx = max(maxx,a[i]);}ll p = maxx+1;ll ans = 0;for(int i = 2; i<=n; i++) {ans += (a[i]-a[i-1] - 1 + p)%p;}printf("%lld\n",ans + n);return 0; }

总结:

   对于这种存在某变量的构造问题,往往可以先讲一些不确定量找到对应的确定量(比如这题要先把p确定了),然后再确定这个存在性的变量(往往和数组中的第一个元素或者某一个元素是对应的)。

总结

以上是生活随笔为你收集整理的【EOJ Monthly 2018.10 - B】 莫干山奇遇 (思维构造,数学,数组,贪心)(总结)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。