import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;



import java.io.BufferedReader;

public class Main{
	public static void main(String[] args) throws IOException, InterruptedException {
		
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int d = sc.nextInt();
		double r = 2*d+1;
		
		out.println((int) Math.ceil(n/r));
		
		out.flush();
	}


}
	
// class st{
//	 
//	int N;
//	long[] val;
//	long[] tree;
//	long[] lazy;
//	
//	st(long[] v){
//		val = v;
//		tree = new long[2*(N = v.length-1)];
//		Arrays.fill(tree, (long) 1e18);
//		lazy = new long[2*N];
//		build(1, 1, N);
//	}
//	
//	void build(int i,int lt,int rt) {
//		if (lt == rt) {
//			tree[i] = val[lt]; 
//		}
//		
//		else {
//			int mid = (lt+rt)/2;
//			
//			build(2*i, lt,mid);
//			build(2*i+1, mid+1, rt);
//			
//			tree[i] = Math.min(tree[2*i] , tree[2*i+1]);  
//		}
//	}
//	
//	void update(int i,int v) {
//		i += N-1;
//		
//		tree[i] += v;
//		
//		while (i > 1) {
//			i>>=1;
//			
//			tree[i] = tree[2*i] + tree[2*i+1]; 
//		}
//	}
//	
//	void updateRange(int l,int r,int v) {
//		if (l > r) {
//			updateRange(1, l, N, 1, N, v);
//			updateRange(1, 1, r, 1, N, v);
//			return;
//		}
//		updateRange(1, l, r, 1, N, v);
//	}
//	void updateRange(int i, int l,int r,int tl,int tr,int v) {
//		
//		if (tr < l || tl > r) 
//			return;
//		
//		if (tl >= l && tr<= r) {
//			tree[i] += v;
//			lazy[i] += v; 
//			return;
//		}
//		
//		int mid = (tl+tr)/2;
//		
//		propagate(i, tl, mid, tr);
//		
//		updateRange(2*i, l, r, tl, mid, v);
//		updateRange(2*i+1, l, r, mid+1, tr, v);
//		
//		tree[i] = Math.min(tree[2*i], tree[2*i+1]); 
//		
//	}
//	
//	void propagate(int i,int tl,int mid, int tr) {
//		lazy[2*i] += lazy[i];
//		lazy[2*i+1] += lazy[i];
//		
//		tree[2*i] += lazy[i];
//		tree[2*i+1] += lazy[i];
//		
//		lazy[i] = 0; 
//	}
//	
//	
//	
//	
//	long query(int l,int r) {
//		if (l > r) {
//			return Math.min(query(l, N), query(1, r));
//		}
//		return query(1, l, r,1,N);
//		
//	}
//	long query(int i, int l,int r,int tl,int tr) {
//		
//		if (l > tr || r < tl) {
//			return (long) 1e18;
//		}
//		
//		if (r >= tr && l <= tl) {
//			return tree[i];
//		}
//		
//		int mid = (tl+tr)/2;
//		
//		propagate(i, tl, mid, tr);
//		
//		long q1 = query(2*i,l,r,tl,mid);
//		long q2 = query(2*i+1,l,r,mid+1,tr);
//		
//		return Math.min(q1,q2);
//		
//	}
//
//}
	
class Scanner {
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream system) {
		br = new BufferedReader(new InputStreamReader(system));
	}

	public String next() throws IOException {
		while (st == null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public String nextLine() throws IOException {
		return br.readLine();
	}

	public int nextInt() throws IOException {
		return Integer.parseInt(next());
	}

	public double nextDouble() throws IOException {
		return Double.parseDouble(next());
	}

	public char nextChar() throws IOException {
		return next().charAt(0);
	}

	public Long nextLong() throws IOException {
		return Long.parseLong(next());
	}

	public boolean ready() throws IOException {
		return br.ready();
	}

	public void waitForInput() throws InterruptedException {
		Thread.sleep(3000);
	}


}
 import java.io.IOException; IOException java.io import java.io.InputStream; InputStream java.io import java.io.InputStreamReader; InputStreamReader java.io import java.io.PrintWriter; PrintWriter java.io import java.util.StringTokenizer; StringTokenizer java.util import java.io.BufferedReader; BufferedReader java.io public class Main{
	public static void main(String[] args) throws IOException, InterruptedException {
		
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int d = sc.nextInt();
		double r = 2*d+1;
		
		out.println((int) Math.ceil(n/r));
		
		out.flush();
	}


} Main public static void main(String[] args) throws IOException, InterruptedException {
		
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int d = sc.nextInt();
		double r = 2*d+1;
		
		out.println((int) Math.ceil(n/r));
		
		out.flush();
	} main {
		
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int d = sc.nextInt();
		double r = 2*d+1;
		
		out.println((int) Math.ceil(n/r));
		
		out.flush();
	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) PrintWriter out = new PrintWriter(System.out); out new PrintWriter(System.out) int n = sc.nextInt(); n sc.nextInt() sc.nextInt sc int d = sc.nextInt(); d sc.nextInt() sc.nextInt sc double r = 2*d+1; r 2*d+1 2*d 2 d 1 out.println((int) Math.ceil(n/r)) out.println out (int) Math.ceil(n/r) Math.ceil Math n/r n r out.flush() out.flush out String[] args args class Scanner {
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream system) {
		br = new BufferedReader(new InputStreamReader(system));
	}

	public String next() throws IOException {
		while (st == null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public String nextLine() throws IOException {
		return br.readLine();
	}

	public int nextInt() throws IOException {
		return Integer.parseInt(next());
	}

	public double nextDouble() throws IOException {
		return Double.parseDouble(next());
	}

	public char nextChar() throws IOException {
		return next().charAt(0);
	}

	public Long nextLong() throws IOException {
		return Long.parseLong(next());
	}

	public boolean ready() throws IOException {
		return br.ready();
	}

	public void waitForInput() throws InterruptedException {
		Thread.sleep(3000);
	}


} Scanner StringTokenizer st; st BufferedReader br; br public Scanner(InputStream system) {
		br = new BufferedReader(new InputStreamReader(system));
	} Scanner {
		br = new BufferedReader(new InputStreamReader(system));
	} br = new BufferedReader(new InputStreamReader(system)) br new BufferedReader(new InputStreamReader(system)) InputStream system system public String next() throws IOException {
		while (st == null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	} next {
		while (st == null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	} while (st == null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine()); st == null || !st.hasMoreTokens() st == null st null !st.hasMoreTokens() st.hasMoreTokens() st.hasMoreTokens st st = new StringTokenizer(br.readLine()) st new StringTokenizer(br.readLine()) return st.nextToken(); st.nextToken() st.nextToken st public String nextLine() throws IOException {
		return br.readLine();
	} nextLine {
		return br.readLine();
	} return br.readLine(); br.readLine() br.readLine br public int nextInt() throws IOException {
		return Integer.parseInt(next());
	} nextInt {
		return Integer.parseInt(next());
	} return Integer.parseInt(next()); Integer.parseInt(next()) Integer.parseInt Integer next() next public double nextDouble() throws IOException {
		return Double.parseDouble(next());
	} nextDouble {
		return Double.parseDouble(next());
	} return Double.parseDouble(next()); Double.parseDouble(next()) Double.parseDouble Double next() next public char nextChar() throws IOException {
		return next().charAt(0);
	} nextChar {
		return next().charAt(0);
	} return next().charAt(0); next().charAt(0) next().charAt next() next 0 public Long nextLong() throws IOException {
		return Long.parseLong(next());
	} nextLong {
		return Long.parseLong(next());
	} return Long.parseLong(next()); Long.parseLong(next()) Long.parseLong Long next() next public boolean ready() throws IOException {
		return br.ready();
	} ready {
		return br.ready();
	} return br.ready(); br.ready() br.ready br public void waitForInput() throws InterruptedException {
		Thread.sleep(3000);
	} waitForInput {
		Thread.sleep(3000);
	} Thread.sleep(3000) Thread.sleep Thread 3000 public class Main{
	public static void main(String[] args) throws IOException, InterruptedException {
		
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int d = sc.nextInt();
		double r = 2*d+1;
		
		out.println((int) Math.ceil(n/r));
		
		out.flush();
	}


} public class Main{
	public static void main(String[] args) throws IOException, InterruptedException {
		
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int d = sc.nextInt();
		double r = 2*d+1;
		
		out.println((int) Math.ceil(n/r));
		
		out.flush();
	}


} Main
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;



import java.io.BufferedReader;

public class Main{
	public static void main(String[] args) throws IOException, InterruptedException {
		
		Scanner sc = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		
		int n = sc.nextInt();
		int d = sc.nextInt();
		double r = 2*d+1;
		
		out.println((int) Math.ceil(n/r));
		
		out.flush();
	}


}
	
// class st{
//	 
//	int N;
//	long[] val;
//	long[] tree;
//	long[] lazy;
//	
//	st(long[] v){
//		val = v;
//		tree = new long[2*(N = v.length-1)];
//		Arrays.fill(tree, (long) 1e18);
//		lazy = new long[2*N];
//		build(1, 1, N);
//	}
//	
//	void build(int i,int lt,int rt) {
//		if (lt == rt) {
//			tree[i] = val[lt]; 
//		}
//		
//		else {
//			int mid = (lt+rt)/2;
//			
//			build(2*i, lt,mid);
//			build(2*i+1, mid+1, rt);
//			
//			tree[i] = Math.min(tree[2*i] , tree[2*i+1]);  
//		}
//	}
//	
//	void update(int i,int v) {
//		i += N-1;
//		
//		tree[i] += v;
//		
//		while (i > 1) {
//			i>>=1;
//			
//			tree[i] = tree[2*i] + tree[2*i+1]; 
//		}
//	}
//	
//	void updateRange(int l,int r,int v) {
//		if (l > r) {
//			updateRange(1, l, N, 1, N, v);
//			updateRange(1, 1, r, 1, N, v);
//			return;
//		}
//		updateRange(1, l, r, 1, N, v);
//	}
//	void updateRange(int i, int l,int r,int tl,int tr,int v) {
//		
//		if (tr < l || tl > r) 
//			return;
//		
//		if (tl >= l && tr<= r) {
//			tree[i] += v;
//			lazy[i] += v; 
//			return;
//		}
//		
//		int mid = (tl+tr)/2;
//		
//		propagate(i, tl, mid, tr);
//		
//		updateRange(2*i, l, r, tl, mid, v);
//		updateRange(2*i+1, l, r, mid+1, tr, v);
//		
//		tree[i] = Math.min(tree[2*i], tree[2*i+1]); 
//		
//	}
//	
//	void propagate(int i,int tl,int mid, int tr) {
//		lazy[2*i] += lazy[i];
//		lazy[2*i+1] += lazy[i];
//		
//		tree[2*i] += lazy[i];
//		tree[2*i+1] += lazy[i];
//		
//		lazy[i] = 0; 
//	}
//	
//	
//	
//	
//	long query(int l,int r) {
//		if (l > r) {
//			return Math.min(query(l, N), query(1, r));
//		}
//		return query(1, l, r,1,N);
//		
//	}
//	long query(int i, int l,int r,int tl,int tr) {
//		
//		if (l > tr || r < tl) {
//			return (long) 1e18;
//		}
//		
//		if (r >= tr && l <= tl) {
//			return tree[i];
//		}
//		
//		int mid = (tl+tr)/2;
//		
//		propagate(i, tl, mid, tr);
//		
//		long q1 = query(2*i,l,r,tl,mid);
//		long q2 = query(2*i+1,l,r,mid+1,tr);
//		
//		return Math.min(q1,q2);
//		
//	}
//
//}
	
class Scanner {
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream system) {
		br = new BufferedReader(new InputStreamReader(system));
	}

	public String next() throws IOException {
		while (st == null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}

	public String nextLine() throws IOException {
		return br.readLine();
	}

	public int nextInt() throws IOException {
		return Integer.parseInt(next());
	}

	public double nextDouble() throws IOException {
		return Double.parseDouble(next());
	}

	public char nextChar() throws IOException {
		return next().charAt(0);
	}

	public Long nextLong() throws IOException {
		return Long.parseLong(next());
	}

	public boolean ready() throws IOException {
		return br.ready();
	}

	public void waitForInput() throws InterruptedException {
		Thread.sleep(3000);
	}


}

