码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-10-03 23:45:47      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:display   ==   结果   str   其他   href   define   fine   acm   

传送门: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\n",res);
33 }
View Code

 

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

标签:display   ==   结果   str   其他   href   define   fine   acm   

原文地址:https://www.cnblogs.com/violet-acmer/p/9739097.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!