P2678 跳石头

2019 - 4 - 17


这道题使我们的市内竞赛的题

 

然则我们都不会

 

现在明白了


这道题的本质就是暴力,二分完了还是暴力,只是二分降低了暴力的次数


让我们开始吧

平坦的成功之路?那只是先驱者踏平的 


——————————————————————

 

难度:普及+/提高-

链接:Miku最好看

——————————————————————

这个题就是一个二分,暴力,思路?很抱歉,我证不出来,

 

你能明白的

——————————————————————

 

 

2019/4/17

哦,对,为什么是l+r+1    /2 呢?

 

 

 

 

________________________________________

 

 

 1 /*
 2 这道题就是二分
 3 
 4 首先,你要找到暴力做法,找到之后,你就会发现这道题的做法了——二分
 5 
 6 
 7 当然,二分的关键,就是区间,关于这个区间,就是距离,我们从一半一半开始二分距离 
 8 
 9 
10 以及,看到二分的关键,你会发现 如果这个mid是合法的,那么答案就在mid—r之间,否则,就在l-mid之间
11 
12 如果大佬您能证明出来,请留在评论区,谢谢 
13 
14 
15 */
16 #include<iostream>
17 
18 using namespace std;
19 int stone[50001];//距离记录石头 
20 
21 int L,N,M;
22 
23 int check(int x)//这里是暴力检查 
24 {
25     int last=0,cnt=0; //上一个点,我们需要移走的石头数 
26     for(int i=1;i<=N+1;++i){//n+1?因为 到终点还有一段路程 
27         if(stone[i]-last<x) cnt++;//如果留着这块石头 就会发现最短路径小于我们的mid,就要删去它
28         
29         //删去了,就不用更新last ,因为石头已经不存在了 
30         else
31         last=stone[i];//留着,更新last 
32     }
33     if(cnt>M) return 0;//我们为了满足条件 需要拿走超过规定的石头,自然是不合法 
34     else return 1; //你明白的 
35 }
36 
37 
38 int main()
39 {
40     cin>>L>>N>>M;
41     for(int i=1;i<=N;++i)
42     {
43         cin>>stone[i];//输入石头位置 
44     }
45     stone[N+1]=L;//处理到终点的路程 
46     int l=1,r=L;
47     while(l<r)//这是二分 
48     {
49         int mid=(l+r+1)/2; 
50         if(check(mid)) l=mid;//看不懂if 
51         //如果您能证明,可不可以留下过程呢 
52         
53         
54         //感性理解 --slk 
55         else
56         r=mid-1;
57     }
58     cout<<l;//输出左区间 
59     return 0; 
60 }
AC

 

 

________________________________________

 

 

Have a good life

 

 

 

---恢复内容结束---

转载于:https://www.cnblogs.com/For-Miku/p/10698374.html

### NOIP 2015 提高组 石头 Python 解题思路 #### 动态规划求解最小踩石子数目 对于给定的独木桥长度以及青蛙跃距离范围,目标是最小化青蛙过河过程中踩到的石子数量。此问题可以通过动态规划来解决。 定义 `dp[i]` 表示到达第 `i` 块石子位置时所踩过的最少石子数[^3]。初始化数组 `dp` 的大小为石子总数加一,并设定初始值均为无穷大(表示不可达),除了起点外设为零因为起始处无任何代价。 遍历每一个可能作为新一步起点的位置 `i` 和每一块可至的新位置 `j` ,更新 `dp[j]` 。具体来说,在每次尝试从某一点跃向另一点的过程中,如果该次跃有效,则比较当前记录下的最优方案与此次新增路径哪个更优并据此调整: ```python import sys def min_stones(n, m, stones): INF = float('inf') # 初始化dp表 dp = [INF] * n dp[0] = 0 for i in range(m): # 对于每一颗石子 for j in range(i + 1, n): # 尝试跃到后面所有的石子上去 distance = abs(stones[j] - stones[i]) if L >= distance >= D and dp[i] != INF: dp[j] = min(dp[j], dp[i] + 1) return min([val for idx,val in enumerate(dp) if stones[idx]>=L]) if any(stones>=L for stones in stones[m:]) else "无法完成" n, l, d, m = map(int, input().split()) stones_position = list(map(int, input().strip().split())) print(min_stones(n, l, d, m)) ``` 上述代码实现了基于动态规划算法计算最短路径的思想,其中 `min_stones()` 函数接收四个参数分别为:总共有多少块石子、独木桥全长、允许的最大单步跨度、已知存在几块固定不动的大石子;而输入部分则提供了这些数据的具体数值形式供调用者传入实际测试案例使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值