leetcode 754. Reach a Number

本文介绍了一个在无限数轴上从位置0出发到达目标位置的算法。通过分析不同情况下的移动策略,给出了一种最小化移动次数的方法,并提供了具体的实现代码。

题目:

You are standing at position 0 on an infinite number line. There is a goal at position target.

On each move, you can either go left or right. During the n-th move (starting from 1), you take n steps.

Return the minimum number of steps required to reach the destination.

Example 1:

Input: target = 3
Output: 2
Explanation:
On the first move we step from 0 to 1.
On the second step we step from 1 to 3.

Example 2:

Input: target = 2
Output: 3
Explanation:
On the first move we step from 0 to 1.
On the second move we step  from 1 to -1.
On the third move we step from -1 to 2.

思路:

开始准备用背包来做,但是写了一会儿觉得不行。

如果每一次都向一个方向走,第n步时走过d=(n+1)n/2的路程,如果d小于target肯定是不行的,所以至少要走到d大于等于target的时候。等于时直接就可以返回1了。超过的部分Example2可以看出需要前面的反向行走。当target与d相差是偶数的时候,前面可以把走(d-target)/2的步长改为相反的,消除差值到target,不用多余的步骤,因为前面步长都是连续的所以肯定可以找到。当target与d相差奇数的时候在前面无法找到一个数直接消除差值。如果当前走的是偶数步(第一步是奇数步,第二步是偶数步),在往前走一步是奇数步,奇数+奇数差值将会变成偶数,可以在前面找到一个消除,多余了一步出来。当前是奇数步的时候无法消除,但是我们可以通过反向一个数将差值减小到1.最后向后走一步长,在向前走一步就可以达到target,就是需要两步完成。

class Solution {
public:
    int reachNumber(int target) {
        target = abs(target);
        if(target == 2) return 3;
        int i = 0;
        int sum = 0;
        while(sum < target) {
            i++;
            sum+=i;
        }
        if(abs(sum-target)%2==0) {
            return i;
        } else {
            if(i%2 == 1) {
                return i+2;
            } else {
                return i+1;
            }
        }
    }
};

请用Prim算法完成本题,代码为c++无注释 T-3 Pay Less, Travel More 分数 35 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 There is an undirected graph with N vertices and M edges where the i-th edge has a cost of C i ​ . You start from vertex S and need to reach vertex T. When you pass through an edge, you need to pay c coins, where c is the minimum cost of all edges you have passed (including the current edge you’re passing). More formally, let E 1 ​ ,E 2 ​ ,⋯,E k ​ be a path from vertex S to vertex T, where E i ​ is the i-th edge in the path. The total number of coins you need to pay for this path will be i=1 ∑ k ​ j=1 min i ​ C E j ​ ​ . Your job is to compute the minimum total coins paid between every pair of vertices. More formally, let d(S,T) be the minimum total number of coins you have to pay if you start from vertex S and finally reach vertex T, you need to calculate S=1 ∑ n ​ T=S+1 ∑ n ​ d(S,T). Input Specification: Each input file contains one test case. For each case, the first line contains 2 positive integers N and M (1≤N≤300,1≤M≤50000), which are the number of vertices and that of the edges, respectively. Then M lines follow, each containing 3 numbers X i ​ , Y i ​ , and C i ​ (1≤X i ​ ,Y i ​ ≤N,X i ​ !=Y i ​ ,0≤C i ​ ≤10 ^5 ) for i=1,⋯,M, where X i ​ and Y i ​ are the two ends of an edge, and C i ​ is its cost. It is guaranteed that the given graph is connected. Output Specification: For each case, output in a line the minimum total coins paid between every pair of vertices. Sample Input 1: 8 10 1 2 10 2 3 2 3 6 50 6 8 3 2 4 4 4 6 1 4 5 3 5 8 5 2 7 2000 7 8 8 Sample Output 1: 189 Sample Input 2: 4 3 1 2 10 2 3 10 2 4 1 Sample Output 2: 49 Hint: For sample 1, the path from vertex 1 to 8 is not unique. The following two paths both have a minimum total cost 16: 1−2−3−6−8 (10+2+2+2=16) 1−2−4−6−8 (10+4+1+1=16) For sample 2, the minimum coins paid path from vertex 1 to 3 is: 1−2−4−2−3 (10+1+1+1=13) 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB
最新发布
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值