import std.algorithm; import std.array; import std.conv; import std.math; import std.range; import std.stdio; import std.string; import std.typecons; T read(T)() { return readln.chomp.to!T; } T[] reads(T)() { return readln.split.to!(T[]); } alias readint = read!int; alias readints = reads!int; int calc(int r, int g, int b) { bool canMake(int n) { int surplus = max(0, r - n)/2 + max(0, g - n)/2 + max(0, b - n)/2; int shortage = max(0, n - r) + max(0, n - g) + max(0, n - b); return surplus >= shortage; } int ans = 0; int lo = 0; int hi = max(r, g, b); while (lo <= hi) { int m = (lo + hi) / 2; if (canMake(m)) { ans = max(ans, m); lo = m + 1; } else { hi = m - 1; } } return ans; } void main() { auto rgb = readints; auto ans = calc(rgb[0], rgb[1], rgb[2]); writeln(ans); }