#include <iostream>
#include <bits/stdc++.h>
#include <math.h> 

using namespace std;
#define gc getchar_unlocked
#define fo(i,n) for(ll i=0;i<n;i++)
#define Fo(i,k,n) for(ll i=k;k<n?i<n:i>n;k<n?i+=1:i-=1)
#define ll long long
#define si(x)	scanf("%d",&x)
#define sl(x)	scanf("%lld",&x)
#define ss(s)	scanf("%s",s)
#define pi(x)	printf("%d\n",x)
#define pl(x)	printf("%lld\n",x)
#define ps(s)	printf("%s\n",s)
#define deb(x) cout << #x << "=" << x << endl
#define deb2(x, y) cout << #x << "=" << x << "," << #y << "=" << y << endl
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define clr(x) memset(x, 0, sizeof(x))
#define sortall(x) sort(all(x))
#define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
#define PI 3.1415926535897932384626
#define ms(a,x) memset(a, x, sizeof(a));
typedef pair<int, int>	pii;
typedef pair<ll, ll>	pl;
typedef vector<int>		vi;
typedef vector<ll>		vl;
typedef vector<pii>		vpii;
typedef vector<pl>		vpl;
typedef vector<vi>		vvi;
typedef vector<vl>		vvl;
int mpow(int base, int exp); 
void ipgraph(int m);
void dfs(int u, int par);
const int mod = 1000000007;
const int N = 3e5, M = N;


// int n;
// pii A[1010][1010];
// char ans[1010][1010];
 
// void dfs(int x, int y){
// 	if (A[x+1][y] == A[x][y] && !ans[x+1][y]){
// 		ans[x+1][y] = 'U';
// 		if (!ans[x][y]) ans[x][y] = 'D';
// 		dfs(x+1, y);
// 	}
// 	if (A[x-1][y] == A[x][y] && !ans[x-1][y]){
// 		ans[x-1][y] = 'D';
// 		if (!ans[x][y]) ans[x][y] = 'U';
// 		dfs(x-1, y);
// 	}
// 	if (A[x][y-1] == A[x][y] && !ans[x][y-1]){
// 		ans[x][y-1] = 'R';
// 		if (!ans[x][y]) ans[x][y] = 'L';
// 		dfs(x, y-1);
// 	}
// 	if (A[x][y+1] == A[x][y] && !ans[x][y+1]){
// 		ans[x][y+1] = 'L';
// 		if (!ans[x][y]) ans[x][y] = 'R';
// 		dfs(x, y+1);
// 	}
// }
 
// int main(){
// 	#ifndef ONLINE_JUDGE
// 	freopen("input.txt","r",stdin);
// 	freopen("output.txt","w",stdout);
// 	#endif

// 	scanf("%d", &n);
// 	for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) scanf("%d %d", &A[i][j].first, &A[i][j].second);
// 	for (int i=1; i<=n; i++) for (int j=1; j<=n; j++){
// 		if (ans[i][j]) continue;
// 		if (A[i][j] == pii(-1,-1)) dfs(i,j);
// 		if (A[i][j] == pii(i,j)){
// 			ans[i][j] = 'X';
// 			dfs(i, j);
// 		}
// 	}
// 	for (int i=1; i<=n; i++) for (int j=1; j<=n; j++){
// 		if (!ans[i][j]){
// 			puts("INVALID");
// 			return 0;
// 		}
// 	}
// 	puts("VALID");
// 	for (int i=1; i<=n; i++) puts(ans[i]+1);
// 	return 0;
// }

// struct Museum{
// 	int cost;
// 	int outside_museum;
// 	Museum(int cost,int outside_museum):: cost(cost), outside_museum(outside_museum) 
//     { 
//     } 
// };

// struct CompareHeight { 
//     bool operator()(Museum const& p1, Museum const& p2) 
//     { 
//         // return "true" if "p1" is ordered  
//         // before "p2", for example: 
//         return p1.cost < p2.cost; 
//     } 
// }; 


// void fn(){
// 	priority_queue<Museum, vector<Museum>, CompareHeight> Q;
// 	unordered_map<int,int> cost_to_museum;

// 	while(!queue.empty()){
// 		Museum temp = q.top();
// 		if( cost_to_museum.find(temp.outside_museum)==cost_to_museum.end()){
// 			cost_to_museum[temp.outside_museum] = temp.cost;
// 			for(auto i:graph[temp.outside_museum]){
// 				//Museum X = Person(arr[i][0], arr[i][1])
// 				Q.push(Museum(cost_to_museum[temp.outside_museum]+cost[i][temp.outside_museum], i))
// 			}
// 		}

// 	}
	
// }
int main(){
	

	int n;cin>>n;
	if(n%2==0)cout<<n/2<<endl;
	else cout<<(n/2)+1<<endl;
	return 0;
}

Measured memory_bytes: 256