Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)
const INF = 0x7fffffff
func main() {
	S := 17
	seat := make([][]int, 27)
	for i :=range seat {
		seat[i] = make([]int, 27)
	}
	ans := make([]int, 105)
	id := 0
	Q := make([][]int, 0)
	for i := 0; i < S; i++ {
		seat[i][0] = -1
	}
	t := -1
	for ans[99] == 0 {
		t++
		if  t%5 == 0 && id <= 99 {
			if id % 5 == 1 {
				n := 5
				tmp := []int{id, n, t}
				Q = append(Q, tmp)
				id++
			} else {
				n := 2
				tmp := []int{id, n, t}
				Q = append(Q, tmp)
				id++
			}
		}
		for i := 0; i < 5; i++ {
			if seat[i][1] == 0 {
				continue
			}
			seat[i][1]--
			if seat[i][1] == 0 {
				seat[i][0] = -1
			}
		}
		f := len(Q)
		for f > 0 {
			i, n := Q[0][0], Q[0][1]
			f = 0
			for j := 0; j < S; j++ {
				g := 0
				for k := 0; k < n; k++ {
					if seat[j+k][0] >= 0 {
						g = 1
						break
					}
				}
				if g != 0 {
					continue
				}
				ans[i] = t-Q[0][2]
				Q = Q[1:]
				f = len(Q)
				for k := 0; k < n; k++ {
					seat[j+k][0] = i
					seat[j+k][1] = 17*(i&1) + 3*(i%3) + 19
				}
				break
			}
		}
	}
	for scanner.Scan() {
		n, _ := strconv.Atoi(scanner.Text())
		fmt.Println(ans[n])
	}
}

C++: #include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <set>

using namespace std;

int main(){

	int n;
	//set<int> escape;
	map<int,vector<int> > escape;

	int data[100];
	//while(cin>>n){
		int field[17];
		fill(field,field+17,-1);

		queue<int> waitQueue;
		int group=0;
		int time=0;

		vector<int> c;
		while(cin>>n){
			c.push_back(n);
		}

		for(int i=0;;i++){
			time=i;
			if(i%5==0){
				waitQueue.push(group);
				group++;
			}
			// Ü¸ÔØêO[vðÈ©çÇ©·
			for(map<int,vector<int> >::iterator it = escape.begin(); it != escape.end(); it++){
				if(it->first==i){
					for(int j = 0; j < 17; j++){
						for(int k = 0; k< it->second.size(); k++){
							if(field[j]==it->second[k]){
								field[j]=-1;
								break;
							}
						}
					}
					it->second.clear();
					break;
				}
			}

			bool f=false;
			int prvCand=-1;
			// ·íêé¾¯·íç¹é
			while(1){
				if(waitQueue.size()==0)
					break;
				// ¡ñÀç¹él
				int cand=waitQueue.front();
				if(prvCand==cand)
					break;
				int s;
				int mergen=-1;
				for(int j = 0; j < 17; j++){
					if(field[j]==-1&&j!=16){
						if(mergen==-1){
							s=j;
							mergen=1;
						}
						else{
							mergen++;
						}
					}
					else{
						if(cand%5==1){
							if(mergen>=5){
								// ·íç¹é
								for(int k = s; k < 5+s; k++){
									field[k]=cand;
								}
							//	cout<<cand<<endl;
								data[cand]=time-cand*5;
								waitQueue.pop();
								escape[17*(cand%2)+3*(cand%3)+19+i].push_back(cand);
								if(cand==99){
									f=true;
									break;
								}
								break;
							}
							else{
								mergen=-1;
							}
						}
						else{
							if(mergen>=2){
							//	cout<<cand<<endl;
								// ·íç¹é
								for(int k = s; k < 2+s; k++){
									field[k]=cand;
								}
								data[cand]=time-cand*5;
								waitQueue.pop();
								escape[17*(cand%2)+3*(cand%3)+19+i].push_back(cand);
								if(cand==99){
									f=true;
									break;
								}
								break;
							}
							else
								mergen=-1;
						}
					}
					if(f)
						break;
				}
				if(f)
					break;
				prvCand=cand;
			}
			if(f)
				break;
		}
		for(int i = 0; i < c.size(); i++){
			// ±±ÅÜ¿Ôð\¦
			cout<<data[c[i]]<<endl;
		}
//	}

	return 0;
}

C++: //Name: Fukushimaken
//Level: 2
//Category: シミュレーション
//Note: 

/**
 * 問題文の通りにシミュレーションする。
 * グループの到着と、食事の終了イベントをpriority_queueに突っ込んで取り出すようにする。
 * 到着したグループは別途queueに突っ込み、席に空きができたら埋めていくようにする。
 *
 * 入力が小さいので、特に効率のよいデータ構造を使わなくても間に合う。
 * オーダーは O(NW log N)。
 * ただしNはグループ数で、N=100。Wは座席の幅で、W=17。
 */
#include <iostream>
#include <queue>

using namespace std;

struct Event {
    enum {
        ARRIVAL,
        FINISH
    } type;
    int t;
    int idx;

    bool operator <(const Event &e) const {
        return t > e.t;
    }
};

int gsize(int n) {
    return (n % 5 == 1 ? 5 : 2);
}

bool solve(bool first) {
    vector<int> res(100, -1);
    priority_queue<Event> eventq;
    for(int i = 0; i < 100; ++i) {
        eventq.push(Event{Event::ARRIVAL, i*5, i});
    }
    eventq.push(Event{Event::FINISH, 500, -1}); // Sentinel
    queue<int> q;
    vector<int> seats(17, -1);
    int lastt = -1;
    while(!eventq.empty()) {
        const Event e = eventq.top();
        eventq.pop();
        if(e.type == Event::ARRIVAL) {
            q.push(e.idx);
        } else {
            for(int i = 0; i < 17; ++i) {
                if(seats[i] == e.idx) seats[i] = -1;
            }
        }
        if(e.t != lastt) {
            while(!q.empty()) {
                const int idx = q.front();
                const int s = gsize(idx);
                int acc = 0;
                int pos = -1;
                for(int i = 0; i < 17; ++i) {
                    if(seats[i] == -1) {
                        ++acc;
                    } else {
                        acc = 0;
                    }
                    if(acc == s) {
                        pos = i - s + 1;
                        break;
                    }
                }
                if(pos == -1) break;
                for(int i = 0; i < s; ++i) {
                    seats[pos+i] = idx;
                }
                res[idx] = e.t - idx*5;
                eventq.push(Event{Event::FINISH, lastt + 17*(idx%2) + 3*(idx%3) + 19, idx});
                q.pop();
                /*
                for(int i = 0; i < 17; ++i) {
                    if(seats[i] == -1) cout << '-';
                    else cout << seats[i]%10;
                }
                cout << endl;
                */
            }
        }
        lastt = e.t;
    }

    int N;
    while(cin >> N) {
        cout << res[N] << endl;
    }
    return false;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout.setf(ios::fixed);
    cout.precision(10);

    bool first = true;
    while(solve(first)) {
        first = false;
    }
    return 0;
}

C++: #include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <complex>
#include <string>
#include <vector>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <functional>
#include <utility>
#include <algorithm>
#include <numeric>
#include <typeinfo>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <ctime>

using namespace std;

#define dump(n) cout<<"# "<<#n<<"="<<(n)<<endl
#define debug(n) cout<<__FILE__<<","<<__LINE__<<": #"<<#n<<"="<<(n)<<endl
#define repi(i,a,b) for(int i=int(a);i<int(b);i++)
#define rep(i,n) repi(i,0,n)
#define iter(c) __typeof((c).begin())
#define foreach(i,c) for(iter(c) i=(c).begin();i!=(c).end();i++)
#define allof(c) (c).begin(),(c).end()
#define mp make_pair

typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int,int> pii;

int blank(const vi& table,int num)
{
	rep(i,table.size()-num+1){
		bool flg=true;
		rep(j,num)
			if(table[i+j])
				flg=false;
		if(flg)
			return i;
	}
	return -1;
}

int main()
{
	vi table(17);
	deque<int> customers;
	vi res(100);
	rep(t,1000){
		rep(i,table.size())
			table[i]=max(table[i]-1,0);
		if(t<=500 && t%5==0)
			customers.push_back(t/5);
		while(customers.size()){
			int customer=customers[0];
			int num=customer%5==1?5:2;
			int index=blank(table,num);
			if(index==-1)
				break;;
			res[customer]=t-customer*5;
			rep(i,num)
				table[index+i]=17*(customer%2)+3*(customer%3)+19;
			customers.pop_front();
		}
	}
	
	for(int n;cin>>n;)
		cout<<res[n]<<endl;
	
	return 0;
}