C. Magic Ship (思维+二分)

本文解析了CodeForces竞赛中一道关于航海路径规划的问题。通过巧妙利用风向的周期性和二分查找的方法,实现了一个高效的算法解决方案。文章详细介绍了如何分离风向和人为移动的影响,并通过前缀和技巧快速计算出达到目标所需的最小天数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://codeforces.com/contest/1117/problem/C

你是一个船长。最初你在点 (x1,y1) (显然,大海上的所有点都可以用平面直角坐标描述),你想去点 (x2,y2) 。

你看了天气预报——一个长为 n 的字符串 s,只包含字母 U, D, L 和 R 。这些字母表示风向。并且,这个天气预报是循环的。例如,第一天风向是 s1 ,第二天是 s2 ,第 n 天是 sn ,则第 n+1 天又是 s1 ,以此类推。

船的坐标按照如下方式改变:

如果风向是 U ,船从 (x,y) 到 (x,y+1) ;

如果风向是 D ,船从 (x,y) 到 (x,y−1) ;

如果风向是 L ,船从 (x,y) 到 (x−1,y) ;

如果风向是 R ,船从 (x,y) 到 (x+1,y) 。

每天,船也能自己向如上四个方向中的一个移动恰好 1 个单位或待在原地。船的位移与风向会相加。如果船待在原地,则只计算风向对船的影响。例如,如果风向是 U ,船向 L 移动,则它会从 (x,y) 移动到 (x−1,y+1) ;如果船向 U 移动,则它会移动到 (x,y+2) 。

你的任务是确定移动到 (x2,y2) 所需的最少天数。

输入
第一行包含两个整数 x1,y1 (0≤x1,y1≤1e9) ——船的初始坐标。

第二行包含两个整数 x2,y2 (0≤x2,y2≤1e9) ——目的地的坐标。

保证初始坐标与目的地的坐标不同。

第三行包含一个整数 n (1≤n≤105) ——字符串 s 的长度。

第四行包含字符串 s ,只包含字母 U, D, L 和 R 。

输出
输出一行,移动到 (x2,y2) 所需的最少天数。

如果不可能输出 −1 。

 

分析:这里有条不明显的递增规律 , 因为到达终点后每天都往与当天风向相反的方向航行就可以停留在原地,就是说可以第x天到达目的地 , 那还可以在比x天更小的天到达目的地。

所以我们可以二分mid天可以到达目的地 ; 现在再来考虑一个问题 , 我们怎么考虑风向的影响 , 既然我们是考虑是mid天到达目的地 ,那在这个mid天里面 , 无论是在那个位置受到的风向的价值都是一样的 ,不会改变 , 所以我们可以考虑 , 把风向的价值与人自己决定的价值分开来计算, 比如一开始我们先不人为走, 只让风吹你走 , 然后可以到达某个位置 , 在判断在这个位置可不可以小于等于mid 步到达 ; 

注意:因为风向是周期性 的 , 所以需要一些前缀和操作来o(1) 找到价值

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
int stx,sty,enx,eny;
int dx[100001],dy[100001];
string str;
bool solve(ll mid)
{
    ll a=mid/n;
    ll b=mid%n;

    ll x=a*dx[n] + dx[b] + stx;///天气是循环的
    ll y=a*dy[n] + dy[b] + sty;
    ll res=abs(x-enx) + abs(y-eny);///曼哈顿距离求所够的天数
    return res<=mid;
}
int main()
{
    cin>>stx>>sty>>enx>>eny>>n>>str;

    for(int i=0 ; i< n; i ++)
    {
        dy[i+1] = dy[i];
        dx[i+1] = dx[i];

        if(str[i]=='U') dy[i+1]++;
        if(str[i]=='D') dy[i+1]--;
        if(str[i]=='L') dx[i+1]--;
        if(str[i]=='R') dx[i+1]++;
    }
    ll head=0 , tail=1e18,ans=-1,mid;
    while(head<=tail)
    {
        mid=(head+tail) >>1;
        if(solve(mid))
        {
            tail=mid-1;
            ans=mid;
        }
        else
        {
            head=mid +1;
        }
    }
    printf("%lld\n",ans);
}
View Code

 

转载于:https://www.cnblogs.com/shuaihui520/p/10672605.html

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值