EOJ2018.10 月赛(B 数学+思维题)

Posted violet-acmer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EOJ2018.10 月赛(B 数学+思维题)相关的知识,希望对你有一定的参考价值。

传送门:Problem B

 https://www.cnblogs.com/violet-acmer/p/9739115.html

 

题意:

  找到最小的包含子序列a的序列s,并且序列s是 p技术分享图片 -莫干山序列。

题解:

  很容易想到 p = max_ai+1,并且a[1]对应着s[1],不然需要在a[1]前加其他数来使的a[1]->某s[i],肯定比不加的序列要长。

  遍历a[ ] 数组,分三种情况讨论

  ①a[i] > a[i-1]

    此种情况下,a[i-1]--a[i]在s中是连续的一段序列,res += a[i]-a[i-1]。

  ②a[i] < a[i-1]

    这种条件对应的情况为 a[i] -> p -> a[i-1] ,res += p-a[i]+a[i-1]。

  ③a[i] == a[i-1]

    相等的话,正好相差一个周期,res += p 。

  注意结果要用 long long 型。

AC代码:

技术分享图片
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define ll long long
 5 const int maxn=2e5+50;
 6 
 7 int a[maxn];
 8 
 9 int main()
10 {
11     int n;
12     scanf("%d",&n);
13     for(int i=1;i <= n;++i)
14         scanf("%d",a+i);
15     ll res=1;
16     int p=0;
17     for(int i=1;i <= n;++i)
18         p=max(p,a[i]);
19     p++;
20     for(int i=2;i <= n;++i)
21     {
22         if(a[i] > a[i-1])
23             res += a[i]-a[i-1];
24         else if(a[i] < a[i-1])
25         {
26             int k=a[i-1]/p;
27             res += ((k+1)*p-a[i-1])+a[i];
28         }
29         else
30             res += p;
31     }
32     printf("%lld
",res);
33 }
View Code

 


以上是关于EOJ2018.10 月赛(B 数学+思维题)的主要内容,如果未能解决你的问题,请参考以下文章

EOJ Monthly 2019.1 唐纳德先生与这真的是签到题吗 数学+暴力+multiset

[EOJ Monthly 2018.10][C. 痛苦的 01 矩阵]

易位构词EOJ3451字符串思维题模拟

EOJ——2019.9月赛 A 才艺展示 (博弈+打表找规律)

EOJ - 3631 Delivery Service 2018.8华师大月赛(树链剖分+贪心)

牛客白月赛31题解