読者です 読者をやめる 読者になる 読者になる

第11回情オリ本選対策7日目(あと使えるのは11日!)

JOI対策日記

イマイチ早起きには失敗した上に眠いががんばる。
9:34-13:00

  • 疲れた。昨日ほどやる気がでない。自分のこのやる気に波がすごくあるのどうにかならないですかね…
  • AOJ 0223 Stray Twins、REの原因がわからんので放置。
  • AOJ 0122 Summer of Phyonkichi
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

int main()
{
	int sx, sy;
	while (scanf("%d %d\n", &sx, &sy), sx || sy) {
		int n;
		scanf("%d\n", &n);

		vector<pair<int, int> > sprs; sprs.reserve(n);
		for (int i = 0; i < n; ++i) {
			int x, y;
			scanf("%d %d", &x, &y);
			sprs.push_back(make_pair(x, y));
		}

		queue<pair<int, pair<int, int> > > qu;
		qu.push(make_pair(0, make_pair(sx, sy)));

		bool res = false;
		while (!qu.empty()) {
			const int step = qu.front().first;
			const pair<int, int> cur = sprs[step];

			const int cx = qu.front().second.first;
			const int cy = qu.front().second.second;

			qu.pop();

			const int dx[] = {2, 2, 1, 0, -1, -2, -2, -2, -1, 0, 1, 2};
			const int dy[] = {0, 1, 2, 2, 2, 1, 0, -1, -2, -2, -2, -1};
			for (int i = 0; i < 12; ++i) {
				const int nx = cx + dx[i], ny = cy + dy[i];
				if (abs(cur.first - nx) <= 1 && abs(cur.second - ny) <= 1) {
					if (step == n - 1) {
						res = true;
						break;
					}
					qu.push(make_pair(step + 1, make_pair(nx, ny)));
				}
			}
			if (res) break;
		}
		printf("%s\n", res ? "OK" : "NA");
	}
	return 0;
}
  • AOJ0200 Traveling Alone: One-way Ticket of Youth、ワーシャルフロイドはじめて書いた。
#include <cstdio>
#include <vector>
#include <climits>
using namespace std;

int main()
{
	int n, m;
	while (scanf("%d %d\n", &n, &m), n || m) {
		vector<vector<unsigned int> > times(m, vector<unsigned int>(m, 1000*301));
		for (int i = 0; i < m; ++i)
			times[i][i] = 0;
		vector<vector<unsigned int> > costs(times);

		for (int i = 0; i < n; ++i) {
			int a, b, cost, time;
			scanf("%d %d %d %d\n", &a, &b, &cost, &time);
			a--, b--;
			times[b][a] = times[a][b] = time;
			costs[b][a] = costs[a][b] = cost;
		}

		for (int k = 0; k < m; ++k)
		for (int i = 0; i < m; ++i)
		for (int j = 0; j < m; ++j) {
			times[i][j] = min(times[i][j], times[i][k] + times[k][j]);
			costs[i][j] = min(costs[i][j], costs[i][k] + costs[k][j]);
		}

		int k;
		scanf("%d\n", &k);
		for (int i = 0; i < k; ++i) {
			int p, q, r;
			scanf("%d %d %d\n", &p, &q, &r);
			p--, q--;
			int res = -1;
			if (r == 0) {
				res = costs[p][q];
			} else if (r == 1) {
				res = times[p][q];
			}
			printf("%d\n", res);
		}
	}
	return 0;
}
  • AOJ 0189 Convenient Location、普通。
#include <cstdio>
#include <vector>
#include <climits>
using namespace std;

int main()
{
	int n;
	while (scanf("%d\n", &n), n) {
		int city = 0;
		vector<vector<int> > dist(10, vector<int>(10, INT_MAX / 2));

		for (int i = 0; i < n; ++i) {
			int a, b, c;
			scanf("%d %d %d\n", &a, &b, &c);
			dist[a][b] = dist[b][a] = c;
			city = max(city, max(a, b));
		}

		city++;
		for (int i = 0; i < city; ++i)
			dist[i][i] = 0;

		for (int k = 0; k < city; ++k)
		for (int i = 0; i < city; ++i)
		for (int j = 0; j < city; ++j)
			dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);

		int res = -1, resLen = INT_MAX;
		for  (int i = 0; i < city; ++i) {
			int cur = 0;
			for (int j = 0; j < city; ++j)
				cur += dist[i][j];
			if (cur < resLen) {
				res = i;
				resLen = cur;
			}
		}
		printf("%d %d\n", res, resLen);
	}
	return 0;
}
  • AOJ 2005 Water Pipe Construction、なんかWAしていた。記憶にない。なんで?
  • AOJ 0212 Highway Express Bus、こういうDijkstraほぼはじめて解いた。
#include <cstdio>
#include <queue>
#include <vector>
#include <climits>
using namespace std;
class Edge {
public:
	int to, len;
	Edge(int to, int len) : to(to), len(len) {}
};

class State {
public:
	int cur, len, ticket;
	State(int cur, int len, int ticket) : cur(cur), len(len), ticket(ticket) {}
	bool operator<(const State& st) const {
		return len > st.len; // to avoid using confusing greater<>
	}
};

int main()
{
	int c, n, m, s, g;
	while (scanf("%d %d %d %d %d\n", &c, &n, &m, &s, &g),
			c || n || m || s || g) {
		s--, g--;

		vector<vector<Edge> > edges(n);
		for (int i = 0; i < m; ++i) {
			int a, b, f;
			scanf("%d %d %d\n", &a, &b, &f);
			a--, b--;
			edges[a].push_back(Edge(b, f));
			edges[b].push_back(Edge(a, f));
		}

		vector<vector<int> > d(n, vector<int>(c + 1, INT_MAX));
		priority_queue<State> pq;

		pq.push(State(s, 0, c));
		d[s][c] = 0;

		while (!pq.empty()) {
			const State st = pq.top(); pq.pop();
			if (st.len > d[st.cur][st.ticket])
				continue;

			for (int useTicket = 0; useTicket < (st.ticket ? 2 : 1);  ++useTicket)
			for (int i = 0; i < edges[st.cur].size(); ++i) {
				const Edge e = edges[st.cur][i];
				if (!(d[e.to][st.ticket - useTicket] >
					st.len + (useTicket ? e.len / 2 : e.len))) 
					continue;

				d[e.to][st.ticket - useTicket] = st.len + (useTicket ? e.len / 2 : e.len);
				pq.push(State(e.to, d[e.to][st.ticket - useTicket], st.ticket - useTicket));
			}
		}
		int res = INT_MAX;
		for (int i = 0; i <= c; ++i) {
			res = min(res, d[g][i]);
		}
		printf("%d\n", res);
	}
	return 0;
}
  • AOJ 0234 Aizu Buried Treasure、なんか答えあわない。
  • つかれた。やる気出ない。ダメじゃん…