import java.util.*;
import java.io.*;
import java.math.BigInteger;

public class Main {
	public static class pair implements Comparable<pair> {
		int x;
		int y;

		public pair(int par1, int par2) {
			x = par1;
			y = par2;
		}

		@Override
		public int compareTo(pair p) {
			return x - p.x;
		}

		@Override
		public String toString() {
			return +x + " " + y;
		}

	}

	static long mod = (long) (1e9 + 7);

	public static long facn(long n, long x) {
		long ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		}
		long k = 1;
		long t = x;
		for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		}
//		BigInteger b = BigInteger.valueOf((k)).modInverse(BigInteger.valueOf((mod)));
		long b = modPow(k, mod - 2, mod);
		return ((b % mod) * ans) % mod;

	}

	public static long modInverse(long a, long m) {
		a = a % m;
		for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x;
		return 1;
	}

	static long modPow(long a, long e, long mod) // O(log e)
	{
		a %= mod;
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		}
		return res % mod;
	}

	public static void bb(Serializable s) {
		System.out.println(55);
	}

	public static int dfs(int u) {
		vis[u] = true;
		rank[u] = rnk;
		int ans = 1;
		for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v);

		return ans;
	}

	public static void dfsD(int u) {
		dist[u] = dst;
		for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v);
	}

	static ArrayList<Integer>[] adj, adj2;
	static int n, m, k, rnk, dst;
	static boolean[] vis;
	static int[] dist, rank;

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		n = sc.nextInt();
		pw.println((n+1)/2);
		pw.close();
	}

	public static class Scanner {
		StringTokenizer st;
		BufferedReader br;

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

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

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

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

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

		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}

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

	}
} import java.util.*; util.* java import java.io.*; io.* java import java.math.BigInteger; BigInteger java.math public class Main {
	public static class pair implements Comparable<pair> {
		int x;
		int y;

		public pair(int par1, int par2) {
			x = par1;
			y = par2;
		}

		@Override
		public int compareTo(pair p) {
			return x - p.x;
		}

		@Override
		public String toString() {
			return +x + " " + y;
		}

	}

	static long mod = (long) (1e9 + 7);

	public static long facn(long n, long x) {
		long ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		}
		long k = 1;
		long t = x;
		for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		}
//		BigInteger b = BigInteger.valueOf((k)).modInverse(BigInteger.valueOf((mod)));
		long b = modPow(k, mod - 2, mod);
		return ((b % mod) * ans) % mod;

	}

	public static long modInverse(long a, long m) {
		a = a % m;
		for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x;
		return 1;
	}

	static long modPow(long a, long e, long mod) // O(log e)
	{
		a %= mod;
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		}
		return res % mod;
	}

	public static void bb(Serializable s) {
		System.out.println(55);
	}

	public static int dfs(int u) {
		vis[u] = true;
		rank[u] = rnk;
		int ans = 1;
		for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v);

		return ans;
	}

	public static void dfsD(int u) {
		dist[u] = dst;
		for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v);
	}

	static ArrayList<Integer>[] adj, adj2;
	static int n, m, k, rnk, dst;
	static boolean[] vis;
	static int[] dist, rank;

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		n = sc.nextInt();
		pw.println((n+1)/2);
		pw.close();
	}

	public static class Scanner {
		StringTokenizer st;
		BufferedReader br;

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

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

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

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

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

		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}

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

	}
} Main static long mod = (long) (1e9 + 7); mod (long) (1e9 + 7) 1e9 7 static ArrayList<Integer>[] adj adj adj2; adj2 static int n n m m k k rnk rnk dst; dst static boolean[] vis; vis static int[] dist dist rank; rank public static long facn(long n, long x) {
		long ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		}
		long k = 1;
		long t = x;
		for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		}
//		BigInteger b = BigInteger.valueOf((k)).modInverse(BigInteger.valueOf((mod)));
		long b = modPow(k, mod - 2, mod);
		return ((b % mod) * ans) % mod;

	} facn {
		long ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		}
		long k = 1;
		long t = x;
		for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		}
//		BigInteger b = BigInteger.valueOf((k)).modInverse(BigInteger.valueOf((mod)));
		long b = modPow(k, mod - 2, mod);
		return ((b % mod) * ans) % mod;

	} long ans = 1; ans 1 for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		} int i = 1; int i = 1; i 1 i <= x i x i++ i++ i {
			ans *= n;
			ans %= mod;
			n--;
		} {
			ans *= n;
			ans %= mod;
			n--;
		} ans *= n ans n ans %= mod ans mod n-- n long k = 1; k 1 long t = x; t x for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		} int i = 1; int i = 1; i 1 i <= t i t i++ i++ i {
			k *= x;
			k %= mod;
			x--;
		} {
			k *= x;
			k %= mod;
			x--;
		} k *= x k x k %= mod k mod x-- x long b = modPow(k, mod - 2, mod); b modPow(k, mod - 2, mod) modPow k mod - 2 mod 2 mod return ((b % mod) * ans) % mod; ((b % mod) * ans) % mod ((b % mod) * ans) (b % mod) b mod ans mod long n n long x x public static long modInverse(long a, long m) {
		a = a % m;
		for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x;
		return 1;
	} modInverse {
		a = a % m;
		for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x;
		return 1;
	} a = a % m a a % m a m for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x; int x = 1; int x = 1; x 1 x < m x m x++ x++ x if ((a * x) % m == 1)
				return x; if ((a * x) % m == 1)
				return x; (a * x) % m == 1 (a * x) % m (a * x) a x m 1 return x; x return 1; 1 long a a long m m static long modPow(long a, long e, long mod) // O(log e)
	{
		a %= mod;
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		}
		return res % mod;
	} modPow {
		a %= mod;
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		}
		return res % mod;
	} a %= mod a mod long res = 1; res 1 while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		} e > 0 e 0 {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		} if ((e & 1) == 1)
				res = (res * a) % mod; (e & 1) == 1 (e & 1) e 1 1 res = (res * a) % mod res (res * a) % mod (res * a) res a mod a = (a * a) % mod a (a * a) % mod (a * a) a a mod e >>= 1 e 1 return res % mod; res % mod res mod long a a long e e long mod mod public static void bb(Serializable s) {
		System.out.println(55);
	} bb {
		System.out.println(55);
	} System.out.println(55) System.out.println System.out System System.out 55 Serializable s s public static int dfs(int u) {
		vis[u] = true;
		rank[u] = rnk;
		int ans = 1;
		for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v);

		return ans;
	} dfs {
		vis[u] = true;
		rank[u] = rnk;
		int ans = 1;
		for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v);

		return ans;
	} vis[u] = true vis[u] vis u true rank[u] = rnk rank[u] rank u rnk int ans = 1; ans 1 for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v); int v adj[u] adj u if (!vis[v])
				ans += dfs(v); if (!vis[v])
				ans += dfs(v); !vis[v] vis[v] vis v ans += dfs(v) ans dfs(v) dfs v return ans; ans int u u public static void dfsD(int u) {
		dist[u] = dst;
		for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v);
	} dfsD {
		dist[u] = dst;
		for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v);
	} dist[u] = dst dist[u] dist u dst for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v); int v adj[u] adj u if (dist[v] == -1)
				dfsD(v); if (dist[v] == -1)
				dfsD(v); dist[v] == -1 dist[v] dist v -1 1 dfsD(v) dfsD v int u u public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		n = sc.nextInt();
		pw.println((n+1)/2);
		pw.close();
	} main {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		n = sc.nextInt();
		pw.println((n+1)/2);
		pw.close();
	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) PrintWriter pw = new PrintWriter(System.out); pw new PrintWriter(System.out) n = sc.nextInt() n sc.nextInt() sc.nextInt sc pw.println((n+1)/2) pw.println pw (n+1)/2 (n+1) n 1 2 pw.close() pw.close pw String[] args args public static class pair implements Comparable<pair> {
		int x;
		int y;

		public pair(int par1, int par2) {
			x = par1;
			y = par2;
		}

		@Override
		public int compareTo(pair p) {
			return x - p.x;
		}

		@Override
		public String toString() {
			return +x + " " + y;
		}

	} pair int x; x int y; y public pair(int par1, int par2) {
			x = par1;
			y = par2;
		} pair {
			x = par1;
			y = par2;
		} x = par1 x par1 y = par2 y par2 int par1 par1 int par2 par2 @Override
		public int compareTo(pair p) {
			return x - p.x;
		} compareTo {
			return x - p.x;
		} return x - p.x; x - p.x x p.x p p.x pair p p @Override
		public String toString() {
			return +x + " " + y;
		} toString {
			return +x + " " + y;
		} return +x + " " + y; +x + " " + y +x + " " + y +x x " " y Comparable public static class Scanner {
		StringTokenizer st;
		BufferedReader br;

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

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

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

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

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

		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}

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

	} Scanner StringTokenizer st; st BufferedReader br; br public Scanner(InputStream s) {
			br = new BufferedReader(new InputStreamReader(s));
		} Scanner {
			br = new BufferedReader(new InputStreamReader(s));
		} br = new BufferedReader(new InputStreamReader(s)) br new BufferedReader(new InputStreamReader(s)) InputStream s s 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 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 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 String nextLine() throws IOException {
			return br.readLine();
		} nextLine {
			return br.readLine();
		} return br.readLine(); br.readLine() br.readLine br public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		} nextDouble {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		} String x = next(); x next() next StringBuilder sb = new StringBuilder("0"); sb new StringBuilder("0") double res = 0 res 0 f = 1; f 1 boolean dec = false dec false neg = false; neg false int start = 0; start 0 if (x.charAt(0) == '-') {
				neg = true;
				start++;
			} x.charAt(0) == '-' x.charAt(0) x.charAt x 0 '-' {
				neg = true;
				start++;
			} neg = true neg true start++ start for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				} int i = start; int i = start; i start i < x.length() i x.length() x.length x i++ i++ i if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				} if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				} x.charAt(i) == '.' x.charAt(i) x.charAt x i '.' {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} res = Long.parseLong(sb.toString()) res Long.parseLong(sb.toString()) Long.parseLong Long sb.toString() sb.toString sb sb = new StringBuilder("0") sb new StringBuilder("0") dec = true dec true {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				} sb.append(x.charAt(i)) sb.append sb x.charAt(i) x.charAt x i if (dec)
						f *= 10; dec f *= 10 f 10 res += Long.parseLong(sb.toString()) / f res Long.parseLong(sb.toString()) / f Long.parseLong(sb.toString()) Long.parseLong Long sb.toString() sb.toString sb f return res * (neg ? -1 : 1); res * (neg ? -1 : 1) res (neg ? -1 : 1) neg -1 1 1 public boolean ready() throws IOException, IOException {
			return br.ready();
		} ready {
			return br.ready();
		} return br.ready(); br.ready() br.ready br public class Main {
	public static class pair implements Comparable<pair> {
		int x;
		int y;

		public pair(int par1, int par2) {
			x = par1;
			y = par2;
		}

		@Override
		public int compareTo(pair p) {
			return x - p.x;
		}

		@Override
		public String toString() {
			return +x + " " + y;
		}

	}

	static long mod = (long) (1e9 + 7);

	public static long facn(long n, long x) {
		long ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		}
		long k = 1;
		long t = x;
		for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		}
//		BigInteger b = BigInteger.valueOf((k)).modInverse(BigInteger.valueOf((mod)));
		long b = modPow(k, mod - 2, mod);
		return ((b % mod) * ans) % mod;

	}

	public static long modInverse(long a, long m) {
		a = a % m;
		for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x;
		return 1;
	}

	static long modPow(long a, long e, long mod) // O(log e)
	{
		a %= mod;
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		}
		return res % mod;
	}

	public static void bb(Serializable s) {
		System.out.println(55);
	}

	public static int dfs(int u) {
		vis[u] = true;
		rank[u] = rnk;
		int ans = 1;
		for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v);

		return ans;
	}

	public static void dfsD(int u) {
		dist[u] = dst;
		for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v);
	}

	static ArrayList<Integer>[] adj, adj2;
	static int n, m, k, rnk, dst;
	static boolean[] vis;
	static int[] dist, rank;

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		n = sc.nextInt();
		pw.println((n+1)/2);
		pw.close();
	}

	public static class Scanner {
		StringTokenizer st;
		BufferedReader br;

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

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

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

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

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

		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}

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

	}
} public class Main {
	public static class pair implements Comparable<pair> {
		int x;
		int y;

		public pair(int par1, int par2) {
			x = par1;
			y = par2;
		}

		@Override
		public int compareTo(pair p) {
			return x - p.x;
		}

		@Override
		public String toString() {
			return +x + " " + y;
		}

	}

	static long mod = (long) (1e9 + 7);

	public static long facn(long n, long x) {
		long ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		}
		long k = 1;
		long t = x;
		for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		}
//		BigInteger b = BigInteger.valueOf((k)).modInverse(BigInteger.valueOf((mod)));
		long b = modPow(k, mod - 2, mod);
		return ((b % mod) * ans) % mod;

	}

	public static long modInverse(long a, long m) {
		a = a % m;
		for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x;
		return 1;
	}

	static long modPow(long a, long e, long mod) // O(log e)
	{
		a %= mod;
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		}
		return res % mod;
	}

	public static void bb(Serializable s) {
		System.out.println(55);
	}

	public static int dfs(int u) {
		vis[u] = true;
		rank[u] = rnk;
		int ans = 1;
		for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v);

		return ans;
	}

	public static void dfsD(int u) {
		dist[u] = dst;
		for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v);
	}

	static ArrayList<Integer>[] adj, adj2;
	static int n, m, k, rnk, dst;
	static boolean[] vis;
	static int[] dist, rank;

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		n = sc.nextInt();
		pw.println((n+1)/2);
		pw.close();
	}

	public static class Scanner {
		StringTokenizer st;
		BufferedReader br;

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

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

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

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

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

		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}

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

	}
} Main
import java.util.*;
import java.io.*;
import java.math.BigInteger;

public class Main {
	public static class pair implements Comparable<pair> {
		int x;
		int y;

		public pair(int par1, int par2) {
			x = par1;
			y = par2;
		}

		@Override
		public int compareTo(pair p) {
			return x - p.x;
		}

		@Override
		public String toString() {
			return +x + " " + y;
		}

	}

	static long mod = (long) (1e9 + 7);

	public static long facn(long n, long x) {
		long ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= n;
			ans %= mod;
			n--;
		}
		long k = 1;
		long t = x;
		for (int i = 1; i <= t; i++) {
			k *= x;
			k %= mod;
			x--;
		}
//		BigInteger b = BigInteger.valueOf((k)).modInverse(BigInteger.valueOf((mod)));
		long b = modPow(k, mod - 2, mod);
		return ((b % mod) * ans) % mod;

	}

	public static long modInverse(long a, long m) {
		a = a % m;
		for (int x = 1; x < m; x++)
			if ((a * x) % m == 1)
				return x;
		return 1;
	}

	static long modPow(long a, long e, long mod) // O(log e)
	{
		a %= mod;
		long res = 1;
		while (e > 0) {
			if ((e & 1) == 1)
				res = (res * a) % mod;
			a = (a * a) % mod;
			e >>= 1;
		}
		return res % mod;
	}

	public static void bb(Serializable s) {
		System.out.println(55);
	}

	public static int dfs(int u) {
		vis[u] = true;
		rank[u] = rnk;
		int ans = 1;
		for (int v : adj[u])
			if (!vis[v])
				ans += dfs(v);

		return ans;
	}

	public static void dfsD(int u) {
		dist[u] = dst;
		for (int v : adj[u])
			if (dist[v] == -1)
				dfsD(v);
	}

	static ArrayList<Integer>[] adj, adj2;
	static int n, m, k, rnk, dst;
	static boolean[] vis;
	static int[] dist, rank;

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		PrintWriter pw = new PrintWriter(System.out);
		n = sc.nextInt();
		pw.println((n+1)/2);
		pw.close();
	}

	public static class Scanner {
		StringTokenizer st;
		BufferedReader br;

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

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

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

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

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

		public double nextDouble() throws IOException {
			String x = next();
			StringBuilder sb = new StringBuilder("0");
			double res = 0, f = 1;
			boolean dec = false, neg = false;
			int start = 0;
			if (x.charAt(0) == '-') {
				neg = true;
				start++;
			}
			for (int i = start; i < x.length(); i++)
				if (x.charAt(i) == '.') {
					res = Long.parseLong(sb.toString());
					sb = new StringBuilder("0");
					dec = true;
				} else {
					sb.append(x.charAt(i));
					if (dec)
						f *= 10;
				}
			res += Long.parseLong(sb.toString()) / f;
			return res * (neg ? -1 : 1);
		}

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

	}
}