Problem:
Score : 100 points

Problem Statement

There are three airports A, B and C, and flights between each pair of airports in both directions.

A one-way flight between airports A and B takes P hours, a one-way flight between airports B and C takes Q hours, and a one-way flight between airports C and A takes R hours.

Consider a route where we start at one of the airports, fly to another airport and then fly to the other airport.

What is the minimum possible sum of the flight times?

Constraints

1 \leq P,Q,R \leq 100

All values in input are integers.

Input

Input is given from Standard Input in the following format:

P Q R

Output

Print the minimum possible sum of the flight times.

Sample Input 1

1 3 4

Sample Output 1

4

The sum of the flight times in the route A \rightarrow B \rightarrow C: 1 + 3 = 4 hours

The sum of the flight times in the route A \rightarrow C \rightarrow C: 4 + 3 = 7 hours

The sum of the flight times in the route B \rightarrow A \rightarrow C: 1 + 4 = 5 hours

The sum of the flight times in the route B \rightarrow C \rightarrow A: 3 + 4 = 7 hours

The sum of the flight times in the route C \rightarrow A \rightarrow B: 4 + 1 = 5 hours

The sum of the flight times in the route C \rightarrow B \rightarrow A: 3 + 1 = 4 hours

The minimum of these is 4 hours.

Sample Input 2

3 2 3

Sample Output 2

5

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <cstdlib>
#include <iostream>
#include <string>
#include <time.h>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <sstream>
#include <iomanip>
#include <vector>
#include <functional>
#include <numeric>
#include <cassert>
#include <algorithm>
#include <functional>
#include <tuple>
#include <bitset>
#include <queue>
//#include "bits/stdc++.h"
using namespace std;
//using namespace std::vector;
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
//#define M_PI 3.1415926535
#define huge 1000000007
typedef long long int ll;
ll gcd(ll a, ll b);
ll lcm(ll x, ll y);
ll bur(ll N, ll X);
bool IsPrime(int num);
bool dp[110][10010];
class UnionFind;

//UF木
class UnionFind {
public:
	//親
	vector<int> Parent;

	//初期状態
	UnionFind(int N) {
		Parent = vector<int>(N, -1);
	}

	int root(int A) {
		if (Parent[A] < 0) return A;
		return Parent[A] = root(Parent[A]);
	}

	//サイズ確認
	int size(int A) {
		return -Parent[root(A)];
	}

	int connect(int A, int B) {
		//root同氏をくっつける
		A = root(A);
		B = root(B);

		//結合済み
		if (A == B) {
			return false;
		}
		//大きいほうに小さいほうをくっつける
		if (size(A) < size(B)) swap(A, B);

		//Aのサイズ更新
		Parent[A] += Parent[B];
		//Bの親をAに
		Parent[B] = A;

		return true;
	}

};

int main(void) {

	ll N = 0;
	ll A = 0;
	ll B = 0;
	ll C = 0;
	ll D = 0;
	ll E = 0;
	ll M = 0;
	ll K = 0;
	//ll T = 0;
	//ll M = 0;
	//ll h[400][400] = {};
	ll b[9] = { 1,7,4,5,3,2,9,6,8 };//順番の配列
	ll b2[9] = { 2,3,4,5,5,5,6,6,7 };//順番の配列

									 //ll aa[20][20] = {};//sortaf
	ll c2[9] = {};

	ll d[10] = {};//要素数

				  //ll v[3] = {};
				  //ll *c, *s, *n;
	string S, T, U[52];
	char fi[50], fv[50];

	ll count = 0;
	double count2 = 0;
	
	ll min = 1000;
	ll max = 1;
	ll dist1 = 0;
	ll dist2 = 0;
	ll dist3 = 0;
	ll now = 0;
	int tmax = 10000;
	int tmax2 = 0;
	//int flag = 0;
	//char temp, head, state;
	//int is = 0;
	bool start = false;

	//char p;

	float all = 0;
	ll amr = 0;
	ll keep = 0;
	ll head = 0;
	ll tail = 0;
	ll lgh = 0;
	//ll state = 0;
	char col = NULL;

	//ll aa[3] = {10000,10000,10000}, bb[3] = { 10000,10000,10000 }, cc[3] = { 10000,10000,10000 };
	//ll an[3] = { 10000,10000,10000 }, bn[3] = { 10000,10000,10000 }, cn[3] = { 10000,10000,10000 };

	cin >> A >> B >> C;
	vector<ll> l(3);
	vector<ll> r(N);
	vector<ll> x2017(672);
	
	l[0] = A;
	l[1] = B;
	l[2] = C;

	//rep(i, 0, N) {
	//	cin >> l[i];
	//	}

	sort(l.begin(), l.end());

	cout << l[0]+l[1] << endl;

	return 0;

}

ll bur(ll N, ll X) {
	ll pan = 1;
	ll pat = 1;
	ll burg = 0;



	if (X > burg) {
		if (N == 0)
			return pat;


		burg += pan;
		burg += bur(N - 1, X);
		burg += pat;
		burg += bur(N - 1, X);
		burg += pan;


	}

	return burg;

}

ll gcd(ll a, ll b) {

	/* 自然数 a > b を確認・入替 */
	if (a<b) {
		ll tmp = a;
		a = b;
		b = tmp;
	}
	ll x = b;
	ll y = a;
	/* ユークリッドの互除法 */
	ll r = a % b;
	while (r != 0) {
		a = b;
		b = r;
		r = a % b;
	}


	return y / b*x;
}

bool IsPrime(int num)
{
	if (num < 2) return false;
	else if (num == 2) return true;
	else if (num % 2 == 0) return false; // 偶数はあらかじめ除く

	double sqrtNum = sqrt(num);
	for (int i = 3; i <= sqrtNum; i += 2)
	{
		if (num % i == 0)
		{
			// 素数ではない
			return false;
		}
	}

	// 素数である
	return true;
}

// 最大公約数を求める関数
ll lcm(ll x, ll y)
{
	if (x == 0 || y == 0)  // 引数チェック
	{
		//fprintf(stderr, "引数エラーです。\n");
		return 0;
	}

	return (x * y / gcd(x, y));
}