Mountain climbing

2024-05-30 20:08
文章标签 mountain climbing

本文主要是介绍Mountain climbing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Problem Description

又这是一个关于登山的问题。现有n座山位于一条直线上,每座山可以看成一条垂直于地面的线段,一端点在地面上,

这些山编号从左往右为1到n,第i座山位于xi高为hi。

对于任意的两座山a和b,如果a的顶端能看见b的顶端,则他们可以用绳索连接。a能看见b,当且仅当他们顶端的连线

不能穿过其他山或者触摸到其他山。若a与b能用绳索连接那么登山者可以用一个单位的时间从a到b或者从b到a

(不论绳索多长,且只能从左边往右边)。

现在我们的目的地第n座山,现在要你求出每座山到达第n座山要需要的最短时间。

 Input

输入第一行为一个正整数T(1<= T < =20),表示有T组数据。

每组数据:

第一行一个整数n(1<=n<=100 000)表示一共n座山。

接下去n行每行两个数xi, hi。 (0<xi,hi<=10^8)

数据保证输入的xi(X1<...<Xi-1<Xi<Xi+1<...<Xn).

 Output

对于每个询问,先输出“Case#i: ”,i表示第i组数据,接着输出n个整数,第i个数表示从第i座山出发最少要花费多少时间能到达目的地。

 Sample Input

5
1 5
2 1
3 2
4 3
5 4

 Sample Output

Case#1: 1 3 2 1 0
/* 
解题报告:三个点 A(x1,y1),B(x2,y2),C(x3,y3);
判断线段AB与点C的关系:
1.(x1-x2)*(y3-y2)-(y1-y2)*(x3-x2)>0(则C在线段AB的上方)
2.(x1-x2)*(y3-y2)-(y1-y2)*(x3-x2) < 0 (则C在线段AB的下方)
3.(x1-x2)*(y3-y2)-(y1-y2)*(x3-x2) == 0 (则C在线段AB上)
*/
//标程:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class point 
{
public:
__int64 x;
__int64 y;
}p[100010];
int dp[100010]; // 记录dp[i]到dp[n]的步数;
int next[100010];  // 记录当前点与下一个相连的点;
int judge(point p0, point p2, point p1){
    __int64 c= (p0.x - p1.x)*(p2.y-p1.y)-(p0.y - p1.y)*(p2.x-p1.x);
    if(c>=0) return 0;
    else return 1;
}
int main()
{
    freopen("a.txt","r",stdin);
    int t, n, i;
scanf("%d",&t);
int k = 0;
while(t--)
{
k++;
scanf("%d",&n);
for(i = 1; i <= n; i ++)
scanf("%I64d%I64d",&p[i].x,&p[i].y);
memset(next,0,sizeof(next));
dp[n] = 0;
dp[n-1] = 1;
next[n-1] = n;
for(i = n-2; i > 0; i --)
{
int temp = i + 1;  
while(temp != n && judge(p[next[temp]],p[temp],p[i]))
{// 如果judge函数return 1,则 点i 和 点next[temp]可以直接相连;
   temp = next[temp];   
}
next[i] = temp;
dp[i] = dp[temp] + 1;
}
printf("Case#%d:",k);
for(i = 1; i <= n; i ++)
printf(" %d",dp[i]);
printf("\n");
}
return 0;
}

这篇关于Mountain climbing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016806

相关文章

leetcode#70. Climbing Stairs

题目 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Note: Given n will be a posi

Maximum Number in Mountain Sequence

Given a mountain sequence of n integers which increase firstly and then decrease, find the mountain top. Example Example 1: Input: nums = [1, 2, 4, 8, 6, 3] Output: 8 Example 2: Input: nums = [

【九度】题目1388:跳台阶 【LeetCode】Climbing Stairs

1、【九度】题目1388:跳台阶 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2435解决:995 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70)。 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台

爬山算法(Hill Climbing Algorithm)详细介绍

爬山算法(Hill Climbing Algorithm)详细介绍 1. 概述 爬山算法(Hill Climbing Algorithm)是一种基于启发式的搜索算法,广泛应用于人工智能、运筹学和优化问题。该算法以当前状态为起点,不断选择邻域中能够提升目标函数值的状态,并逐步朝着目标前进,直到达到局部最优解。 2. 算法原理 爬山算法的核心思想是“贪心策略”(Greedy Strategy)

hdu-1049-Climbing Worm

#include<stdio.h> int  main() { int a,b,c,i,sum; while(scanf("%d%d%d",&a,&b,&c)&&a) { sum=0; for(i=0;;i++) { if(sum>=a) break; if(i%2==0) sum+=b; else  sum-=c;

【LeetCode】70. Climbing Stairs【牛客网】变态跳台阶

今天在LeetCode做到一个动态规划的题,之前在牛客网做过一道“变态跳台阶”的题,猛一看还以为是一个意思,牛客网那边能AC,LeetCode这边却不能AC,很奇怪,其实题目有细微的差别, 这两题难道不是一个意思吗? 1、跳台阶 题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种方法? 与LeetCode Problem No.70 Cl

LeetCode之旅(16)-Climbing Stairs

题目描述: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 先验知识: 斐波那契数列 斐波那契数列(Fib

70. Climbing Stairs dynamic programming

You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? Note: Given n will be a positive

Leetcode: Climbing Stairs

题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? 思路分析: 设 f (n) 表示爬 n 阶楼梯的不

[leetcode]Climbing Stairs

class Solution {public:int climbStairs(int n) {// Start typing your C/C++ solution below// DO NOT write int main() functionif(n <= 2) return n;vector<int> f(n+1, 0);f[1] = 1;f[2] = 2;for(int i = 3; i