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-1] -> p -> a[i] ,res += p-a[i-1]+a[i]。

  ③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
原文地址:https://www.cnblogs.com/violet-acmer/p/9739097.html