BJ 17143釣り王
42070 ワード
https://www.acmicpc.net/problem/17143
サメ同士の捕食整理の過程で初期化ミスを犯し、
また,ArrayListではなくLinkedListを用いて各リストインデックスにアクセスする時間が非常に長く,タイムアウトの問題も発生した.
問題を解くのに多くの時間がかかったが、2つのリストの違いを考え直すきっかけになった.
huntingShark(i); moveShark(); arrangeShark();
各ラウンドに必要な上記の関数を実現した.サメ同士の捕食整理の過程で初期化ミスを犯し、
また,ArrayListではなくLinkedListを用いて各リストインデックスにアクセスする時間が非常に長く,タイムアウトの問題も発生した.
問題を解くのに多くの時間がかかったが、2つのリストの違いを考え直すきっかけになった.
package day0413;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class KingofFishing {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static StringTokenizer st;
static int R, C, M, answer = 0;
static ArrayList<Shark> sList;
static Shark[][] map;
static class Shark implements Comparable<Shark> {
int x;
int y;
int s; // 속력
int d; // 방향
int z; // 크기
public Shark(int x, int y, int s, int d, int z) {
super();
this.x = x;
this.y = y;
this.s = s;
this.d = d;
this.z = z;
}
@Override
public int compareTo(Shark o) {
return this.x - o.x != 0 ? this.x - o.x : ((this.y - o.y != 0) ? this.y - o.y : (o.z - this.z));
}
}
static void moveShark() {
for (Shark s : sList) {
switch (s.d) { // 상 하 우 좌
case 1:
s.x -= s.s % (R * 2 - 2);
while (s.x < 0 || s.x >= R) {
if (s.x < 0) {
s.x = -s.x;
s.d = 2;
}
if (s.x >= R) {
s.x = (R - 1) - (s.x - (R - 1));
s.d = 1;
}
}
break;
case 2:
s.x += s.s % (R * 2 - 2);
while (s.x < 0 || s.x >= R) {
if (s.x < 0) {
s.x = -s.x;
s.d = 2;
}
if (s.x >= R) {
s.x = (R - 1) - (s.x - (R - 1));
s.d = 1;
}
}
break;
case 3:
s.y += s.s % (C * 2 - 2);
while (s.y < 0 || s.y >= C) {
if (s.y < 0) {
s.y = -s.y;
s.d = 3;
}
if (s.y >= C) {
s.y = (C - 1) - (s.y - (C - 1));
s.d = 4;
}
}
break;
case 4:
s.y -= s.s % (C * 2 - 2);
while (s.y < 0 || s.y >= C) {
if (s.y < 0) {
s.y = -s.y;
s.d = 3;
}
if (s.y >= C) {
s.y = (C - 1) - (s.y - (C - 1));
s.d = 4;
}
}
break;
}
}
}
static void arrangeShark() { // 위치가 겹치는 상어 정리.
map = new Shark[R][C];
int size = sList.size();
for (int i = size - 1; i >= 0; i--) {
Shark s = sList.get(i);
if (map[s.x][s.y] == null) {
map[s.x][s.y] = s;
continue;
}
if(map[s.x][s.y].z < s.z) {
sList.remove(map[s.x][s.y]);
map[s.x][s.y] = s;
} else {
sList.remove(s);
}
}
}
static void huntingShark(int idx) {
for (int i = 0; i < R; i++) {
if (map[i][idx] != null) {
answer += map[i][idx].z;
sList.remove(map[i][idx]);
map[i][idx] = null;
return;
}
}
}
static void printmap() {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (map[i][j] == null) {
System.out.print("0 ");
} else {
System.out.print(map[i][j].z + " ");
}
}
System.out.println();
}
System.out.println(answer);
}
public static void main(String[] args) throws IOException {
st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
sList = new ArrayList<>();
map = new Shark[R][C];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
sList.add(new Shark(Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()) - 1,
Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken())));
Shark tmp = sList.get(i);
map[tmp.x][tmp.y] = tmp;
}
//printmap();
for (int i = 0; i < C; i++) {
huntingShark(i);
moveShark();
arrangeShark();
//printmap();
}
bw.append(answer + "");
bw.flush();
}
}
Reference
この問題について(BJ 17143釣り王), 我々は、より多くの情報をここで見つけました https://velog.io/@mraz0210/BJ17143-낚시왕テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol