제출 #1142042

#제출 시각아이디문제언어결과실행 시간메모리
1142042weajinkNavigation 2 (JOI21_navigation2)C++20
0 / 100
0 ms792 KiB
// Rozwiazanie wzorcowe, model code z oj.uz. max_value = 12
#include <vector>
#include <algorithm>
#include <cassert>
#include "Anna.h"

namespace {
	int encode(int dr, int dc) {
		if(dc >= +2) return 2;
		if(dc <= -2) return 3;
		if(dr >= +2) return 4;
		if(dr <= -2) return 5;
		return (dr + 1) * 3 + (dc + 1) + 6;
	}
}

void Anna(int N, int K, std::vector<int> R, std::vector<int> C) {
	assert(K==7);
	// Step #1 : Decide placement of "flags with number 1"
	int optflag = 14; int optdelta = -1;
	for(int delta = 0; delta < 9; ++delta) {
		int maxflag = 1;
		for(int i = 0; i < N; ++i) {
			for(int j = 0; j < N; ++j) {
				int precinct = ((i - delta / 3 + 3) % 3) * 3 + ((j - delta % 3 + 3) % 3);
				if(precinct <= 6) {
					maxflag = std::max(maxflag, encode(R[precinct] - i, C[precinct] - j));
				}
			}
		}
		if(optflag > maxflag) {
			optflag = maxflag;
			optdelta = delta;
		}
	}
	
	// Step #2 : Make a provisional plan
	std::vector<std::vector<int> > F(N, std::vector<int>(N, -1));
	for(int i = 0; i < N; ++i) {
		for(int j = 0; j < N; ++j) {
			int precinct = ((i - optdelta / 3 + 3) % 3) * 3 + ((j - optdelta % 3 + 3) % 3);
			if(precinct <= 6) {
				F[i][j] = encode(R[precinct] - i, C[precinct] - j);
			}
			if(precinct == 8) {
				F[i][j] = 1;
			}
		}
	}
	
	// Step #3. Apply "decrease-by-1" operation and finalize the plan
	std::vector<bool> used(14, false);
	for(int i = 0; i < N; ++i) {
		for(int j = 0; j < N; ++j) {
			if(F[i][j] != -1) {
				used[F[i][j]] = true;
			}
		}
	}
	int non = (int)(std::find(used.begin() + 1, used.end(), false) - used.begin());
	std::vector<std::vector<int>>answer(N);
	for(int i = 0; i < N; ++i) {
		for(int j = 0; j < N; ++j) {
			if(F[i][j] == -1) {
				F[i][j] = non - 1;
			}
			else if(F[i][j] > non) {
				--F[i][j];
			}
			answer[i].push_back(F[i][j]);
//			SetFlag(i, j, F[i][j]);
		}
	}
	for (int i = 0; i < N; i++){
	  for (int j = 0; j < N; j++){
	    SetFlag(i,j,F[i][j]);
	  }
	}
}
// Rozwiazanie wzorcowe, model code z oj.uz. max_value = 12
#include <vector>
#include <algorithm>
#include <cassert>
#include "Bruno.h"

namespace {
	int encode(int dr, int dc) {
		if(dc >= +2) return 2;
		if(dc <= -2) return 3;
		if(dr >= +2) return 4;
		if(dr <= -2) return 5;
		return (dr + 1) * 3 + (dc + 1) + 6;
	}
}
std::vector<int> Bruno(int K, std::vector<int> value) {
	return {4,4,4,4,4,4,4};
  // Step #1. Restore the plan before "decrease-by-1" operation
	int center = int(std::find(value.begin(), value.end(), 1) - value.begin());
	int rp = (center / 3 + 1) % 3, cp = (center % 3 + 1) % 3;
	std::vector<int> precinct(9);
	for(int i = 0; i < 9; ++i) {
		precinct[i] = ((i / 3 - rp + 3) % 3) * 3 + ((i % 3 - cp + 3) % 3);
	}
	int seventh = int(std::find(precinct.begin(), precinct.end(), 7) - precinct.begin());
	int non = value[seventh] + 1;
	for(int i = 0; i < 9; ++i) {
		if(value[i] >= non) {
			++value[i];
		}
	}
	
	// Step #2. Determine the next actions
	std::vector<int> res(K, -1);
	for(int i = 0; i < K; ++i) {
		int ptr = int(std::find(precinct.begin(), precinct.end(), i) - precinct.begin());
		int id = value[ptr] - 2;
		if(id <= 3) {
			res[i] = id;
		}
		else {
			int isor = ((id - 4) / 3 - 1) + (ptr / 3 - 1);
			int isoc = ((id - 4) % 3 - 1) + (ptr % 3 - 1);
			if(isoc > 0) res[i] = 0;
			else if(isoc < 0) res[i] = 1;
			else if(isor > 0) res[i] = 2;
			else if(isor < 0) res[i] = 3;
			else res[i] = 4;
		}
	}
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...