Problem:
Score : 200 points

Problem Statement

There are N apple trees in a row. People say that one of them will bear golden apples.

We want to deploy some number of inspectors so that each of these trees will be inspected.

Each inspector will be deployed under one of the trees. For convenience, we will assign numbers from 1 through N to the trees. An inspector deployed under the i-th tree (1 \leq i \leq N) will inspect the trees with numbers between i-D and i+D (inclusive).

Find the minimum number of inspectors that we need to deploy to achieve the objective.

Constraints

All values in input are integers.

1 \leq N \leq 20

1 \leq D \leq 20

Input

Input is given from Standard Input in the following format:

N D

Output

Print the minimum number of inspectors that we need to deploy to achieve the objective.

Sample Input 1

6 2

Sample Output 1

2

We can achieve the objective by, for example, placing an inspector under Tree 3 and Tree 4.

Sample Input 2

14 3

Sample Output 2

2

Sample Input 3

20 4

Sample Output 3

3

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

#if DEBUG
using Microsoft.VisualStudio.TestTools.UnitTesting;
#endif
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;  // cannot be used in GCJ
using System.Text;
using System.Threading.Tasks;

namespace Contest
{
    public class Program
    {
        public static IO.StreamScanner scanner = new IO.StreamScanner(Console.OpenStandardInput());

        public static void Main()
        {
            var n = scanner.Integer();
            var d = scanner.Integer();

            var ans = GetAns(n, d);

            IO.Printer.Out.WriteLine(ans);
            IO.Printer.Out.Flush();
        }

        public static int GetAns(int n, int d)
        {
            return (int)Math.Ceiling((double)(n) / (d * 2 + 1));
        }
    }
    

#if DEBUG

    [TestClass]
    public class Test
    {
        [TestMethod]
        public void Test1()
        {
            Assert.AreEqual(2, Program.GetAns(6, 2));
            Assert.AreEqual(2, Program.GetAns(14, 3));
            Assert.AreEqual(3, Program.GetAns(20, 4));

        }

        public static bool IsEq(IEnumerable<IEnumerable<int>> l1, IEnumerable<IEnumerable<int>> l2)
        {
            if (l1.Count() != l2.Count()) return false;
            for (int i = 0; i < l1.Count(); i++)
            {
                if (!IsEq(l1.ElementAt(i), l2.ElementAt(i))) return false;
            }
            return true;
        }

        public static bool IsEq(IEnumerable<int> l1, IEnumerable<int> l2)
        {
            if (l1.Count() != l2.Count()) return false;
            for(int i=0; i<l1.Count(); i++)
            {
                if (l1.ElementAt(i) != l2.ElementAt(i)) return false;
            }
            return true;
        }

        public static bool IsEq(IEnumerable<double> l1, IEnumerable<double> l2)
        {
            if (l1.Count() != l2.Count()) return false;
            for (int i = 0; i < l1.Count(); i++)
            {
                if (!IsEq(l1.ElementAt(i), l2.ElementAt(i))) return false;
            }
            return true;
        }

        public static bool IsEq(IEnumerable<bool> l1, IEnumerable<bool> l2)
        {
            if (l1.Count() != l2.Count()) return false;
            for (int i = 0; i < l1.Count(); i++)
            {
                if (l1.ElementAt(i) != l2.ElementAt(i)) return false;
            }
            return true;
        }

        public static bool IsEq(double a, double b)
        {
            return Math.Abs(a - b) < 1E-5;
        }
    }


#endif

    // Used in LeetCode
    public class TreeNode
    {
        public int val;
        public TreeNode left;
        public TreeNode right;
        public TreeNode(int x) { val = x; }
    }

    public static class LeetCode
    {
        public static TreeNode ParseBinaryTree(string str)
        {
            var ar = str.Replace("[", "").Replace("]", "").Split(',');

            var nodes = new List<TreeNode>();
            for (int i = 0; i < ar.Length; i++)
            {
                nodes.Add(ar[i] == "null" ? null : new TreeNode(int.Parse(ar[i])));
                var parent = (i + 1) / 2 - 1;

                // if the node class parent property
                //if(parent >= 0)
                //{
                //    nodes.Last().Parent = nodes[parent];
                //}
            }

            for (int i = 0; i < nodes.Count(); i++)
            {
                var l = (i + 1) * 2 - 1;
                var r = (i + 1) * 2;
                if (l >= 0 && l < nodes.Count() && nodes[i] != null) nodes[i].left = nodes[l];
                if (r >= 0 && r < nodes.Count() && nodes[i] != null) nodes[i].right = nodes[r];
            }

            return nodes.First();
        }

        public static IList<IList<int>> ParseLLI(string str)
        {
            var ret = new List<IList<int>>();

            var split = str.Split(']');
            foreach (var s in split)
            {
                var v = s.Replace(",[", "").Replace(", [", "").Replace("[", "");
                if (string.IsNullOrWhiteSpace(v))
                {
                    ret.Add(new List<int>());
                    continue;
                }
                ret.Add(v.Split(',').Select(i => int.Parse(i)).ToList());
            }

            return (IList<IList<int>>)ret;
        }

        public static IList<int> ParseLI(string str)
        {
            str = str.Replace("[", "").Replace("]", "");
            return str.Split(',').Select(v => int.Parse(v)).ToList();
        }
    }

    namespace IO
    {
        using System.IO;
        using System.Text;
        using System.Globalization;

        public class Printer : StreamWriter
        {
            static Printer()
            {
                Out = new Printer(Console.OpenStandardOutput()) { AutoFlush = false };
            }

            public static Printer Out { get; set; }

            public override IFormatProvider FormatProvider
            {
                get { return CultureInfo.InvariantCulture; }
            }

            public Printer(Stream stream)
                : base(stream, new UTF8Encoding(false, true))
            {
            }

            public Printer(Stream stream, Encoding encoding)
                : base(stream, encoding)
            {
            }

            public void Write<T>(string format, T[] source)
            {
                base.Write(format, source.OfType<object>().ToArray());
            }

            public void WriteLine<T>(string format, T[] source)
            {
                base.WriteLine(format, source.OfType<object>().ToArray());
            }
        }

        public class StreamScanner
        {
            public StreamScanner(Stream stream)
            {
                str = stream;
            }

            public readonly Stream str;
            private readonly byte[] buf = new byte[1024];
            private int len, ptr;
            public bool isEof;

            public bool IsEndOfStream
            {
                get { return isEof; }
            }

            private byte read()
            {
                if (isEof) return 0;
                if (ptr < len) return buf[ptr++];
                ptr = 0;
                if ((len = str.Read(buf, 0, 1024)) > 0) return buf[ptr++];
                isEof = true;
                return 0;
            }

            public char Char()
            {
                byte b;
                do b = read(); while ((b < 33 || 126 < b) && !isEof);
                return (char)b;
            }

            public string Scan()
            {
                var sb = new StringBuilder();
                for (var b = Char(); b >= 33 && b <= 126; b = (char)read())
                    sb.Append(b);
                return sb.ToString();
            }

            public string ScanLine()
            {
                var sb = new StringBuilder();
                for (var b = Char(); b != '\n'; b = (char)read())
                    if (b == 0) break;
                    else if (b != '\r') sb.Append(b);
                return sb.ToString();
            }

            public long Long()
            {
                if (isEof) return long.MinValue;
                long ret = 0;
                byte b;
                var ng = false;
                do b = read(); while (b != 0 && b != '-' && (b < '0' || '9' < b));
                if (b == 0) return long.MinValue;
                if (b == '-')
                {
                    ng = true;
                    b = read();
                }
                for (; ; b = read())
                {
                    if (b < '0' || '9' < b)
                        return ng ? -ret : ret;
                    ret = ret * 10 + b - '0';
                }
            }

            public int Integer()
            {
                return (isEof) ? int.MinValue : (int)Long();
            }

            public double Double()
            {
                var s = Scan();
                return s != "" ? double.Parse(s, CultureInfo.InvariantCulture) : double.NaN;
            }

            static T[] enumerate<T>(int n, Func<T> f)
            {
                var a = new T[n];
                for (int i = 0; i < n; ++i) a[i] = f();
                return a;
            }

            public char[] Char(int n)
            {
                return enumerate(n, Char);
            }

            public string[] Scan(int n)
            {
                return enumerate(n, Scan);
            }

            public double[] Double(int n)
            {
                return enumerate(n, Double);
            }

            public int[] Integer(int n)
            {
                return enumerate(n, Integer);
            }

            public long[] Long(int n)
            {
                return enumerate(n, Long);
            }
        }
    }
}