답안 #208662

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
208662 2020-03-12T01:35:10 Z E869120 수열 (BOI14_sequence) C++14
67 / 100
1000 ms 1016 KB
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int N, A[1 << 18];
bool used[10000009][10];
bool used3[1009][10];
bool used4[10009][10];

void init() {
	for (int i = 0; i < 10000; i++) {
		int cx = i;
		while (cx >= 1) {
			used[i][cx % 10] = true;
			cx /= 10;
		}
	}
	for (int i = 0; i < 1000; i++) {
		int cx = i;
		for (int j = 0; j < 3; j++) {
			used3[i][cx % 10] = true;
			cx /= 10;
		}
	}
	for (int i = 0; i < 10000; i++) {
		int cx = i;
		for (int j = 0; j < 4; j++) {
			used4[i][cx % 10] = true;
			cx /= 10;
		}
	}
}

bool check(int pos) {
	for (int i = 0; i < N; i++) {
		if (used[pos][A[i]] == false) return false;
		pos++;
	}
	return true;
}

int cnt[109][10];

string fixes(string V, bool flag) {
	if (V == "") {
		if (flag == true) V = "1";
		else V = "0";
	}
	else if (V[0] == '0') {
		if (V.size() == 1) V = "10";
		else swap(V[0], V[1]);
	}
	return V;
}

long long solve(int dig) {
	for (int i = 0; i < 101; i++) {
		for (int j = 0; j < 10; j++) cnt[i][j] = 0;
	}

	int maxt = 0, ret = 0;
	for (int i = 0; i < N; i++) {
		int V1 = (dig + i) % 1000;
		int V2 = (dig + i) / 1000;
		maxt = max(maxt, V2);
		if (used3[V1][A[i]] == true) continue;
		cnt[maxt][A[i]] = 1;
	}

	vector<int> J[10];
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j <= maxt; j++) { if (cnt[j][i] == 1) J[i].push_back(j); }
	}

	// ケース 1: 下 3 桁が XYZ の場合
	long long m1 = (1LL << 60);
	for (int i = 0; i < 900; i++) {
		int v[10] = { 0,0,0,0,0,0,0,0,0,0 }; bool flag = false;
		for (int k = 0; k < 10; k++) {
			for (int j : J[k]) { if (used3[i + j][k] == false) { v[k] = 1; break; } }
		}
		for (int j : J[0]) { if (used[i + j][0] == false) { flag = true; break; } }
		string S = ""; for (int j = 0; j < 10; j++) { if (v[j] == 1) S += ('0' + j); }
		S = fixes(S, flag);
		long long eval = 1000000LL * stoll(S) + 1000LL * i + dig;
		m1 = min(m1, eval);
	}

	// ケース 2: 下 4 桁が X9YZ の場合
	long long m2 = (1LL << 60);
	for (int i = 0; i < 9000; i++) {
		if ((i % 1000) <= 899) continue;
		int v[10] = { 0,0,0,0,0,0,0,0,0,0 }; bool flag = false;
		for (int k = 0; k < 10; k++) {
			for (int j : J[k]) { if (used4[i + j][k] == false) { v[k] = 1; break; } }
		}
		for (int j : J[0]) { if (used[i + j][0] == false) { flag = true; break; } }
		string S = ""; for (int j = 0; j < 10; j++) { if (v[j] == 1) S += ('0' + j); }
		S = fixes(S, flag);
		long long eval = 10000000LL * stoll(S) + 1000LL * i + dig;
		m2 = min(m2, eval);
	}

	return min(m1, m2);
}

int main() {
	cin >> N; init();
	for (int i = 0; i < N; i++) cin >> A[i];

	// ステップ 1. 1000 以下を全探索
	for (int i = 1; i <= 100; i++) {
		if (check(i) == true) {
			cout << i << endl;
			return 0;
		}
	}

	// ステップ 2. そうでない場合
	long long minx = (1LL << 60);
	for (int i = 0; i <= 999; i++) {
		minx = min(minx, solve(i));
	}
	cout << minx << endl;
	return 0;
}

Compilation message

sequence.cpp: In function 'long long int solve(int)':
sequence.cpp:63:16: warning: unused variable 'ret' [-Wunused-variable]
  int maxt = 0, ret = 0;
                ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 504 KB Output is correct
2 Correct 356 ms 504 KB Output is correct
3 Correct 5 ms 504 KB Output is correct
4 Correct 345 ms 636 KB Output is correct
5 Correct 5 ms 504 KB Output is correct
6 Correct 5 ms 504 KB Output is correct
7 Correct 181 ms 504 KB Output is correct
8 Correct 197 ms 504 KB Output is correct
9 Correct 5 ms 504 KB Output is correct
10 Correct 381 ms 504 KB Output is correct
11 Correct 5 ms 504 KB Output is correct
12 Correct 335 ms 504 KB Output is correct
13 Correct 338 ms 632 KB Output is correct
14 Correct 387 ms 504 KB Output is correct
15 Correct 392 ms 632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 504 KB Output is correct
2 Correct 359 ms 632 KB Output is correct
3 Correct 5 ms 504 KB Output is correct
4 Correct 335 ms 504 KB Output is correct
5 Correct 5 ms 504 KB Output is correct
6 Correct 5 ms 504 KB Output is correct
7 Correct 189 ms 632 KB Output is correct
8 Correct 183 ms 504 KB Output is correct
9 Correct 192 ms 504 KB Output is correct
10 Correct 5 ms 504 KB Output is correct
11 Correct 296 ms 504 KB Output is correct
12 Correct 381 ms 504 KB Output is correct
13 Correct 5 ms 504 KB Output is correct
14 Correct 339 ms 504 KB Output is correct
15 Correct 348 ms 504 KB Output is correct
16 Correct 388 ms 504 KB Output is correct
17 Correct 385 ms 504 KB Output is correct
18 Correct 344 ms 596 KB Output is correct
19 Correct 349 ms 508 KB Output is correct
20 Correct 384 ms 632 KB Output is correct
21 Correct 345 ms 504 KB Output is correct
22 Correct 398 ms 592 KB Output is correct
23 Correct 391 ms 504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 504 KB Output is correct
2 Correct 263 ms 736 KB Output is correct
3 Correct 250 ms 656 KB Output is correct
4 Correct 303 ms 636 KB Output is correct
5 Correct 295 ms 632 KB Output is correct
6 Correct 225 ms 636 KB Output is correct
7 Correct 703 ms 1016 KB Output is correct
8 Correct 553 ms 888 KB Output is correct
9 Correct 936 ms 1016 KB Output is correct
10 Correct 927 ms 1016 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 504 KB Output is correct
2 Correct 357 ms 600 KB Output is correct
3 Correct 6 ms 504 KB Output is correct
4 Correct 334 ms 504 KB Output is correct
5 Execution timed out 1059 ms 888 KB Time limit exceeded
6 Halted 0 ms 0 KB -