洛谷 P9344. 去年天气旧亭台

去年天气旧亭台

题目背景

依旧是过往的天气,过往的楼台烟雨。时间悄悄流逝着,山河仍在,人却已不是过去的人……

题目描述

登上楼台,旧时满面沉灰的地板映入眼帘。

共有 n 块地板,地板分为两类,第 i 块地板的类别用 ci 表示,积灰程度用 ai 表示。注意 ci01

现在要清理这些地板上的灰尘。每次操作中,你可以:

+ 选择两个下标 i,j,满足 1ijnci=cj且第 i 块和第 j 块地板上的灰尘均未被清理过
+ 花费 ai+aj 的能量清理i 块到第 j 块所有地板上的灰尘。

求清理完所有地板上的灰尘至少要多少能量。

输入格式

本题有多组测试数据

第一行一个整数 T,表示测试数据组数。

对于每组测试数据:

- 第一行一个整数 n
- 第二行 n 个整数 a1,a2,,an
- 第三行 n 个整数 c1,c2,,cn

输出格式

对于每组测试数据,一行一个整数表示最小能量。

样例输入 #1

```
2
6
1 1 4 5 1 4
1 0 0 1 0 1
8
3 1 4 1 5 9 2 6
1 0 1 0 1 0 1 0
```

样例输出 #1

```
5
13
```

提示

【样例 1 解释】

- 对于第一组数据,直接花费 a1+a6=5 的能量清理所有灰尘。
- 对于第二组数据,先花费 a1+a1=6 的能量清理第一个地板上的灰尘,再花费 a2+a8=7 的能量清理剩余灰尘。

【数据规模与约定】

对于 10% 的数据,保证 T10n10

对于 40% 的数据,保证 T20n103

另有 10% 的数据,保证 ci=1

对于 100% 的数据,保证 1T1051n,n2×106ci{0,1}1ai109


----------

 (动态规划) O(n)

洛谷5月月赛第二题,怎么说呢,还是比较简单的
考虑DP

fi为擦干净前i块地板的最小能量
显然可以推出状态转移方程:
fi=max1j<i,cj+1=cifj+aj+1+ai

复杂度O(Tn2),会TLE
考虑优化

将式子拆开
fi=max1j<i,cj+1=cifj+aj+1+ai
显然,max部分和i无关,范围只增大不减小,所以可以用前缀和优化
复杂度O(Tn)=O(n)=106

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstring>
 
using namespace std;
 
typedef long long LL; //注意long long
 
const int N = 2000010;
const LL INF = 0xffffffffff;
 
int n, c[N], a[N];
LL f[N];
 
int main()
{
    int T;
    scanf("%d", &T);
 
    while (T -- )
    {
        scanf("%d", &n);
        for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
        for (int i = 1; i <= n; i ++ ) scanf("%d", &c[i]);
 
        memset(f, 0x3f, sizeof f);
        f[0] = 0;
        LL min_v0 = INF, min_v1 = INF; //c_j + 1 = 0的最小值和c_j + 1 = 1的最小值
 
        for (int i = 1; i <= n; i ++ ) //DP
        {
            if (!c[i]) min_v0 = min(min_v0, f[i - 1] + a[i]);
            else min_v1 = min(min_v1, f[i - 1] + a[i]);
            f[i] = min(f[i], (c[i] ? min_v1 : min_v0) + a[i]);
        }
        printf("%lld\n", f[n]);
    }
    return 0;
}

 


__EOF__

本文作者xyy's blog
本文链接https://www.cnblogs.com/xyy-yyds/p/17418449.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   xuyiyang  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示