Problem:
Score : 100 points

Problem Statement

There are two buttons, one of size A and one of size B.

When you press a button of size X, you get X coins and the size of that button decreases by 1.

You will press a button twice. Here, you can press the same button twice, or press both buttons once.

At most how many coins can you get?

Constraints

All values in input are integers.

3 \leq A, B \leq 20

Input

Input is given from Standard Input in the following format:

A B

Output

Print the maximum number of coins you can get.

Sample Input 1

5 3

Sample Output 1

9

You can get 5 + 4 = 9 coins by pressing the button of size 5 twice, and this is the maximum result.

Sample Input 2

3 4

Sample Output 2

7

Sample Input 3

6 6

Sample Output 3

12

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

using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string[] args)
        {
            //問題クラスを展開
            ProgramA a = new ProgramA();
            a.main();//実行する

        }

    }

    class ProgramA
    {
        public void main()
        {
            //入力
            string[] s = Console.ReadLine().Split(' ');
            int a = int.Parse(s[0]);
            int b = int.Parse(s[1]);

            if(a > b)
                Console.WriteLine(2* a -1);
            else if(a < b)
                Console.WriteLine(2 * b - 1);
            else
                Console.WriteLine(a +b);

        }
    }

    class ProgramB
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            string[] v = Console.ReadLine().Split(' ');
            string[] c = Console.ReadLine().Split(' ');
            int sum = 0;


            //v-cをしてマイナスでなければ足す
            for (int i = 0; i < n; i++)
            {
                if (int.Parse(v[i]) - int.Parse(c[i]) > 0)
                    sum += int.Parse(v[i]) - int.Parse(c[i]);
            }

            //答え出力
            Console.WriteLine(sum);
            

        }
    }

    class ProgramC
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            long[] R = new long[n];
            long[] L = new long[n];

           

            string[] a = Console.ReadLine().Split(' ');
            L[0] = long.Parse(a[0]);
            R[0] = long.Parse(a[n - 1]);

            //左からのgcdと右からのgcdを求める
            for (int i = 1; i < n; i++)
            {
                L[i] = gcd(L[i - 1], long.Parse(a[i]));
                R[i] = gcd(R[i - 1], long.Parse(a[n - 1 - i]));
            }

            long max = 0;

            for (int i = 0; i < n; i++)
            {
                //それぞれの位置で引き出す
                long temp = 0;
                if (i == 0)//一番左は右n-1個分のみで考える
                    temp = R[n - 2];
                else if(i == n- 1)//一番右は左n-1個分のみで考える
                    temp = L[n - 2];
                else
                    temp = gcd(L[i - 1], R[n - 2 - i]);

                //最大を求める
                max = Math.Max(max, temp);
            }

            //答えを出力
            Console.WriteLine(max);

        }

        /*最大公約数を求める関数*/
        static long gcd(long p, long q)
        {
            if (p < q)
            {
                long temp = p;
                p = q;
                q = temp;
            }

            long r = 1;

            while (r != 0)
            {
                r = p % q;
                p = q;
                q = r;
            }

            return p;
        }

    }


    class ProgramD
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            string[] a = Console.ReadLine().Split(' ');

            long[] dp_u = new long[n];
            long[] dp_d = new long[n];

            dp_u[1] = -(long.Parse(a[0]) + long.Parse(a[1])); 
            dp_d[1] = long.Parse(a[0]) + long.Parse(a[1]);

            for (int i = 2; i < n; i++)
            {
                dp_u[i] = Math.Max(dp_u[i - 1] - long.Parse(a[i]) + 2 * long.Parse(a[i - 1]), dp_d[i - 1] - long.Parse(a[i]) - 2 *long.Parse(a[i - 1]));
                dp_d[i] = Math.Max(dp_u[i - 1] + long.Parse(a[i]), dp_d[i - 1] + long.Parse(a[i]));

            }


            //答を出す
            Console.WriteLine(Math.Max(dp_u[n -1], dp_d[n -1]));

        }

    }

    class ProgramD2
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            string[] a = Console.ReadLine().Split(' ');

            long count = 0;
            int flag = 0;
            long min = 10000000000;
            long sum = 0;

            //いれて0があるか、負の数は何個か、絶対値の最小は何か求めておく
            for (int i = 0; i < n; i++)
            {
                long temp = long.Parse(a[i]);

                if (temp == 0)
                    flag = 1;
                if (temp < 0) 
                    count++;

                sum += Math.Abs(temp);
                min = Math.Min(Math.Abs(temp),min);

            }


            //答を出す
            if(flag == 1 ||count % 2 == 0)
                Console.WriteLine(sum);
            else
                Console.WriteLine(sum - 2 * min);


        }

    }



}