http://acm.hdu.edu.cn/showproblem.php?pid=5523
XY在玩一个游戏:有N根柱子排成一排,编号为1到N,每个柱子上面有一块宝石,现在XY站在第S根柱子上,出口在第T跟柱子上,XY需要拿到所有宝石后从出口离开。每次XY可以走到相邻的柱子上,也可以使用超能力跳到第一根柱子或者第N根柱子上,如果离开了柱子之后再也不能到达这里。为了节省能量,XY想用最少次数超能力通关。
这算是一道讨论题吧。细心。。。
把它抽象成“向量”,答案就是“向量”个数-1
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int n,s,t; int main() { while(cin>>n>>s>>t){ int ans; if(n==1) ans=0; else { int t1=s,t2=t; if(s>t)swap(s,t); if(s==t) ans=-1; else if(s==1&&t==n) ans=0; else if((t1==1&&t2!=n) || (t1==n&&t2!=1)) ans=1; else if(t-s==1) ans=1; else ans=2; } printf("%d\n",ans); } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=5524
一棵有N个节点的完全二叉树,问有多少种子树所包含的节点数量不同。赠图说明:
import java.util.*;
public class Main {
static int add,deep,maxdeep;
static long n;
static void find(long q){
long lh=q,rh=q;
deep=0;
while(lh*2<=n){
lh*=2;
deep++;
}
while(rh*2+1<=n) rh=rh*2+1;
if(lh<=rh){
maxdeep=deep>maxdeep?deep:maxdeep;
}
else {
find(2*q);
find(2*q+1);
add++;
}
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
add=0;
maxdeep=0;
n=cin.nextLong();
find(1);
System.out.println(maxdeep+1+add);
}
}
}