yzoj P2371 爬山 题解】的更多相关文章

背景 其实 Kano 曾经到过由乃⼭,当然这名字⼀看⼭主就是 Yuno 嘛.当年 Kano 看见了由乃⼭,内⼼突然涌出了⼀股杜甫会当凌绝顶,⼀览众⼭⼩的 豪⽓,于是毅然决定登⼭.但是 Kano 总是习惯性乱丢垃圾,增重环卫⼯⼈ 的负担,Yuno 并不想让 Kano 登⼭,于是她果断在⼭上设置了结界-- 题意 Yuno 为了⽅便登⼭者,在⼭上造了 N 个营地,编号从 0 开始.当结界发动时,每当第 $ i(> 0) $ 号营地内有⼈,那么他将被传送到第 $ A_i (< i) $ 号营 地,如此…
题意:给n个积木,搭成两个高度相同的塔,问最高高度 正解是dp 答案在dp[n][0] 代码 #include<bits/stdc++.h> using namespace std; int f[2][1000050],n,a[51],ans; int main(){ memset(f,-0x3f,sizeof(f)); scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i])…
题意 先讲一下一种容易陷入误区错误思路 要使时间最小,就去找相对于每个点的最短曼哈顿距离,然后取最大值,时间就是(maxn+1)/2. 代码 #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #include<iostream> #define ll long long #define MX 55 using namespace std; int d[MX…
题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i,j,k)表示在(i,j)时人的方向是k,然后对于两个点(i,j,k)和(i,j,kk),如果k和kk是两个旋转90度能转换的方向,就连一条边权为1的边,而对于(i,j,k)和(i+dx[ k],j+dy[k],k)连一条边权为0的边,表示从(i,j)在方向为k的情况下能向k方向走一步到达(i+dx…
T组数据,给出N,求出N!最右边非零的数. 对于30%的数据,N <= 30,T<=10. 对于全部的数据,N <= 10^2009,T<=30. 一道数学题 解析 N!/(10^x)最后一位数字即是结果.10^x进行拆分,变成5^x* 2^x.怎么除以5^x呢,好办,乘的时候含有5的倍数的一项全部不乘进去,再递归此过程.即 1 2 3 4 (15) 6 7 8 9 (25) 11 12 13 14 (35)16 17 18 19 (45) 21 22 23 24 (55) 26…
纯数论 30分:纯暴力,直接模拟判断t秒后,判断hp是否小于0 60分: atk>=h,就是一炮一个,那么军队会在min(n,t)秒之后停止攻击,那么总伤害就是a[n+(n-1) +(n-2)+........(n-min(n,t)+1) 等差数列求和d=a(2n-min(n,t)+1)*(min(n,t))/2; 如果d>=hp Yes,否则No: 100分 考虑前t秒军队伤害总和,然后和hp比较大小 先算几下打死一个士兵,设m下 那么前m秒伤害为nma m+1到2m秒伤害为m(n-1)a…
Analysis 这道题是搜索,类似于小木棍,加一些剪枝. 第一个剪枝是如果当前的答案已经大于了我们已知的最小答案,不用说直接return返回即可. 第二个剪枝是我们可以将小猫的体重从大到小排序,这样我们的搜索树就会缩短许多. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 18+10 using namespace std; typ…
爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左面第一个大于当前值的值,极右值为右面第一个大于当前值的值 ,找到最大值然后当前符合的子段个数就为$r-l+1+(r-now)*(now-l)$ 解释一下$r-l+1$为以$now$为边界的子段,$(r-now)*(now-l)$为包含$now$的子段 那么问题又转化为了如何求边界 我们发现找极左值,…
题意 类似于就是背包. 解析 代码 跟解析有点不一样v[i]价值,w[i]重量,s背包容积,背包转移即可. #include<bits/stdc++.h> using namespace std; const int maxn=1e4+5; int n,s,x,y,tot,ans; int v[maxn],w[maxn],dp[maxn]; int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf(&qu…
题意 dfs骗了30分,一开始想的距离正解差一点啊,贪心加dp就可以过的水题,真正太蒻了 解析 代码 #include<bits/stdc++.h> using namespace std; struct node{ int x; int y; }a[210]; int m,n,k; int f[210][210]; bool book[210]; long long ans; bool cmp(node a,node b){ return a.y>b.y; } int main(){…