Codeforces Round #809 (Div. 2)C.Qpwoeirut And The City

题目大意:

  当一栋楼比旁边两栋楼都高的时候,这栋楼为cool,对除了1和n以外的所有楼可以增加任意层,问在满足使最多的楼cool的前提下的花费最小。

 

当n为奇数的情况下:

  cool的楼实际上是固定的,只要将他们需要的花费加起来就好。

当n为偶数的情况下:

  cool的楼并不固定,但是他的形式是固定的,要么所有cool楼之间隔一个楼,要么cool楼之间除了一个间隔2,其他全部间隔1;

  所以我们可以通过枚举间隔2来枚举所有情况,取消费的最小值。

  举个例子:0 1 0 1 0 1 0 0 1 0 1 0 /*间隔为2的只有一组*/

 1 void solve() {
 2 
 3     cin >> n;
 4     for (int i = 1; i <= n; ++i) {
 5         cin >> a[i];
 6         b[i] = c[i] = 0;
 7     }
 8     b[0] = c[0] = b[n + 1] = c[n + 1] = 0;
 9     for (int i = 2; i <= n-1; i += 2) {
10         int maxv = max(a[i - 1], a[i + 1]);
11         b[i] += max(1ll*0, 1ll * maxv - a[i] + 1);
12     }
13     for (int i = n - 1; i >= 2; i -= 2) {
14         int maxv = max(a[i - 1], a[i + 1]);
15         c[i] += max(1ll*0, 1ll * maxv - a[i] + 1);
16     }
17     for (int i = 1; i <= n; ++i) b[i] += b[i - 1];/*前缀和*/
18     for (int i = n; i >= 1; --i) c[i] += c[i + 1];/*后缀和*/
19 
20     if (n & 1) {
21         cout << b[n - 1] << endl;
22         return;
23     } else {
24         int minn =1e18;
25         for (int i = 1; i <= n; ++i) {
26             minn = min(minn, b[i] + c[i + 1]);/*枚举间隔*/
27         }
28         cout << minn << endl;
29     }
30 }

比较新的就是枚举间隔的方法,用前后缀枚举

其次比较需要注意的是数据范围,超过平常的1e9了,所以注意读题

posted @ 2022-07-19 15:34  empty_y  阅读(84)  评论(0)    收藏  举报