EOJ2018.10 月赛(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\n",res); 33 }