P9344 去年天气旧亭台
注意,所有的 都是正数。
对于第一档分, pts,是给暴力的。
对于第二档分,可以考虑一个 , 表示 消完 到 所要的代价最小,那就从当前的 往前找,找到能消去的(颜色相同)去更新 的值,方程是:
时间是 。
接下来看正解:
分两类讨论。
对于这种情况的话,直接选择 这个区间消去即可。代价为 。这样做是最优的,因为 和 两个位置作为首尾,消去的时候这两个位置必选,那么就必然含有 和 ,加上如果中间选择一些辅助 进行消去,必然不如第一种消去方法优秀。
所以我们有结论,对于 ,如果 ,那么消去这个区间的最小代价就一定是 。
首先有的一个结论是,必然会存在至少一个 和 ,使得 等于 , 等于 。
考虑采用反证法证明,如果不存在的话, 必然会等于 (如果不等于 的话就符合上面的情况了。)以此类推, ,但是这样的话 ,也就是 和 两个区间,矛盾。故得证。
所以我们可以找到至少一组 的情况,根据第一种情况的结论,那么最小值就是 。 的时间扫一遍找这个值的最小就好。
时间为 。
#include<bits/stdc++.h>
using namespace std;
const int N =5e6+10;
#define int long long
int a[N],c[N];
signed main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>c[i];
if(c[1]==c[n])
{
cout<<a[1]+a[n]<<endl;
continue;
}
int ans=LONG_LONG_MAX;
for(int i=1;i<n;i++)
if(c[i]==c[1]&&c[i+1]==c[n])
ans=min(ans,a[i]+a[1]+a[n]+a[i+1]);
cout<<ans<<endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现