首页 > 其他分享 >CF612F Simba on the Circle

CF612F Simba on the Circle

时间:2024-11-08 15:43:09浏览次数:1  
标签:所有权 min int 相邻 abs CF612F Circle Simba dp

分析:

对于输出答案真的很好做,然后被输出路径恶心到了。。。

上来先离散化 + 去重简化题目,用 \(v[i]\) 记录权值为 \(i\) 的点,\(a[i]\) 为点 \(i\) 的权值。

那么行径的每一步可以分为两类:

  1. 从 \(v[i]\) 内的点到 \(v[i+1]\) 的点。

  2. 从 \(v[i]\) 内的点到 \(v[i]\) 内的点。

设 \(dp[i]\) 为走完了所有权值小于等于 \(a[i]\) 的点后留在了 \(i\) 的最小花费。

设 \(f[i]\) 为走完了所有权值小于 \(a[i]\) 的点(以及 \(i\) 本身)后留在了 \(i\) 的最小花费。

我们发现由 \(dp[x]\) 推出 \(f[y]\) \((a[y]=a[x]+1)\) 便是第一类步,由 \(f[x]\) 推出 \(dp[y]\) \((a[x]=a[y])\)为第二类步。

第一类很好处理:

\[f[y]=\min(dp[x]+\min(abs(x-y),n-abs(x-y)))(y\in v[a[y]-1]) \]

\(\min(abs(x-y),n-abs(x-y))\) 即是考虑图是环形,\(f[y]\) 为走完了所有权值小于 \(a[y]\) 的点后留在 \(y\) 的花费,应该由一个已经处理了所有权值小于等于 \(a[y]-1\) 的地方推来的,即是属于 \(v[a[y]-1]\) 的 \(x\) 的 \(dp[x]\)。

第二类:

请不要在意中间的三座火山,两座活火山,一座死火山...那只是心血来潮的产物,大人总是需要我来解释,这让我很心累(。

显然要求从一个点出发然后遍历完所有的点,最后停留在一个点便是从 \(f\) 的状态变为了 \(dp\) 的状态了。

从 \(x\) 出发到 \(y\)。

如果 \(y\) 与 \(x\) 不相邻,显然要求从 \(x\) 出发转一圈后停在与 \(x\) 相邻的一个点后再返回 \(y\),这必然不会优于直接停留在那个与 \(x\) 相邻的点,因此只用考虑 \(x\) 与 \(y\) 相邻两种情况(左右)了。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
int a[N],b[N],dp[N],f[N];
vector<int>v[N];
int main()
{
    int n,cnt=0,m=0,s;
    cin>>n>>s;
    for(int i=1;i<=n;++i) cin>>a[i],b[++m]=a[i];
    sort(b+1,b+n+1);m-=b+m+1-unique(b+1,b+n+1);
    for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+m+1,a[i])-b,v[a[i]].push_back(i);
    memset(dp,63,sizeof(dp));memset(f,63,sizeof(f));
    for(int i=1;i<=m;++i)
    {
        for(auto x:v[i])
        {
            if(i==1) {int y=s;dp[x]=min(dp[x],min(abs(x-y),n-abs(x-y)));}
            else {for(auto y:v[i-1]) dp[x]=min(dp[x],dp[y]+min(abs(x-y),n-abs(x-y)));};
        }
        if(v[i].size()==1) continue;
        for(int j=0;j<v[i].size();++j)
        {
            int x=v[i][j],y,w1,w2;
            if(j!=0) y=v[i][j-1],w1=dp[y]+n-(x-y);
            else y=v[i][v[i].size()-1],w1=dp[y]+y-x;
            if(j!=v[i].size()-1) y=v[i][j+1],w2=dp[y]+n-(y-x);
            else y=v[i][0],w2=dp[y]+x-y;
            f[x]=min(w1,w2);
        }
        for(auto x:v[i]) dp[x]=f[x];
    }
    int ed=0;
    for(auto x:v[m]) if(dp[x]<dp[ed]) ed=x;
    cout<<dp[ed]<<'\n';
    return 0;
}

至于输出路径?只需要简单地在记录最小值时记录是从哪儿推出的就行了...有些繁琐但只需要注意点细节就行了,所以不在此赘述。

完整代码:Submission #265943935 - Codeforces

标签:所有权,min,int,相邻,abs,CF612F,Circle,Simba,dp
From: https://www.cnblogs.com/ilibilib/p/18535213

相关文章

  • PTA 作业三 继承与多态 JAVA 6-1 从抽象类shape类扩展出一个圆形类Circle 面向对象程
    6-1从抽象类shape类扩展出一个圆形类Circle分数25作者 张德慧单位 西安邮电大学请从下列的抽象类shape类扩展出一个圆形类Circle,这个类圆形的半径radius作为私有成员,类中应包含初始化半径的构造方法。publicabstractclassshape{//抽象类publicabstractdoubleg......
  • OpenCV结构分析与形状描述符(20)计算一个包围给定点集的最小外接圆函数minEnclosingCirc
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述找到一个包围二维点集的最小面积的圆。该函数使用迭代算法来寻找一个二维点集的最小外接圆。这意味着函数将会通过反复逼近的过程来计算出能够包围所有给定点且面积最小的圆。mi......
  • OpenCV(cv::circle())
    目录1.函数2.示例3.说明4.使用场景cv::circle()是OpenCV提供的一个函数,用于在图像上绘制圆形。它非常适用于在图像处理任务中标记特定的点或区域。这个函数具有多种参数,允许你根据需要控制圆的颜色、位置、半径和边界厚度。1.函数voidcv::circle(InputOutputArrayi......
  • (1) 定义一个Circle类,包含一个double型的radius属性代表圆的半径,findArea()方法返回圆
    1publicclassHomework13{2//编写一个mian方法3publicstaticvoidmain(String[]args){4Circlec=newCircle();5PassObjectpo=newPassObject();6po.printAreas(c,5);78}9}101112classCircle{13......
  • cf:Removals Game(博弈论模拟),Black Circles(距离)
    RemovalsGame题目爱丽丝得到了[1,2,...,n]的置换al,a2,...,a,鲍勃得到了[1,2...,n],的另一个置换b1,b2,...在每个转折中,下列事件按顺序发生:爱丽丝选择数组中的第一个或最后一个元素,并从数组中移除它;鲍勃选择数组中的第一个或最后一个元素,并将它从数组中移除。游戏继续n-1轮,之后两个......
  • [UnrealCircle]腾讯 罗谦 | UnLua-UE4下的Lua脚本插件
    传送门:[UnrealCircle]腾讯罗谦|UnLua-UE4下的Lua脚本插件_哔哩哔哩_bilibili参考PPT:UnrealCircle921北京PPT_免费高速下载|百度网盘-分享无限制一.UnLua基础1.1概念UnLua是一个脚本插件UnLua不是蓝图的替代,而是一种补充没有Asset预览不支持nativization......
  • LeetCode 1041. Robot Bounded In Circle
    原题链接在这里:https://leetcode.com/problems/robot-bounded-in-circle/description/题目:Onaninfiniteplane,arobotinitiallystandsat (0,0) andfacesnorth.Notethat:The northdirection isthepositivedirectionofthey-axis.The southdirection ......
  • 【例1330】get arc center of full bolt circle 获取完整螺栓圆弧的中心
    文章作者:里海来源网站:NX二次开发官方案例专栏简介《getarccenteroffullboltcircle获取完整螺栓圆弧的中心》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,......
  • CF1971F Circle Perimeter
    题目Givenaninteger\(r\),findthenumberoflatticepointsthathaveaEuclideandistancefrom\((0,0)\)greaterthanorequalto\(r\)butstrictlylessthan\(r+1\).Alatticepointisapointwithintegercoordinates.TheEuclideandistance......
  • 【白鲸优化算法】 tent、chebyshev、Singer、Logistic、Sine, Circle多种混沌初始化的
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......