반응형
코드포스(Codeforces) 1538A Stone Game 풀이 코드
C | C++ | Java | Python
Difficulty : *800 (Brute force / DP / Greedy)
문제 해설
폴리카프는 새로운 게임을 하고 있습니다. 주어진 수열의 가장 큰 수와 가장 작은 수를 가장 적은 횟수 내로 없애는 게임입니다. 가장 작은 수는 1로 고정이고 가장 큰 수는 수열의 크기와 같습니다. 한 번에 한 숫자만 없앨 수 있으며, 없앨 수 있는 숫자는 매번 수열 양 끝의 숫자 뿐입니다.
풀이
가장 작은 수(1)와 가장 큰 수(수열의 크기)의 위치를 알아낸 후, 두 지점을 기준으로 수열을 나눌 때 생기는 세 거리를 각각 구합니다. 이 세 거리 중 짧은 순으로 두 개를 합하는 것이 정답입니다.
코드
#include <stdio.h>
int main(){
int n, m, i, j, maxslot, minslot, mid, dis1, dis2, dis3, result, arr[101];
for(i = 0; i<101;i++){
arr[i] = 0;
}
scanf("%d", &n);
//find min and max
for(i = 0; i < n; i++){
scanf("%d", &m);
for(j = 0; j < m; j++){
scanf("%d", &arr[j]);
if(arr[j]==m){
maxslot = j;
}
if(arr[j]==1){
minslot = j;
}
}
mid = j/2;
//get distance
if(minslot<maxslot){
dis1 = minslot + 1;
dis2 = maxslot - minslot;
dis3 = j-maxslot;
}
else{
dis1 = maxslot + 1;
dis2 = minslot - maxslot;
dis3 = j-minslot;
}
//get shortest distance
if(dis1<=dis2&&dis1<=dis3){
if(dis2<dis3){
result = dis1 + dis2;
}
else{result = dis1 + dis3;}
}
else if(dis2<=dis1&&dis2<=dis3){
if(dis1<dis3){
result = dis1 + dis2;
}
else{result = dis2 + dis3;}
}
else if(dis3<=dis1&&dis3<=dis2){
if(dis1<dis2){
result = dis1 + dis3;
}
else{result = dis2 + dis3;}
}
printf("%d\n", result);
for(j = 0; j < 101; j++){
arr[j] = 0;
}
}
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n, m, maxslot, minslot, mid, dis1, dis2, dis3, result, arr[101], dist_list[3];
for(int i = 0; i < 101; i++){
arr[i] = 0;
}
cin>>n;
//find min and max
for(int i = 0; i < n; i++){
cin>>m;
for(int j = 0; j < m; j++){
cin>>arr[j];
if(arr[j]==m){
maxslot = j;
}
if(arr[j]==1){
minslot = j;
}
}
mid = m/2;
//get distance
if(minslot<maxslot){
dis1 = minslot + 1;
dis2 = maxslot - minslot;
dis3 = m-maxslot;
}
else{
dis1 = maxslot + 1;
dis2 = minslot - maxslot;
dis3 = m-minslot;
}
//get shortest distance
dist_list[0] = dis1, dist_list[1] = dis2, dist_list[2] = dis3;
sort(dist_list, dist_list+3);
result = dist_list[0] + dist_list[1];
cout<<result<<endl;
for(int j = 0; j < 101; j++){
arr[j] = 0;
}
}
return 0;
}
import java.util.*;
public class Main{
public static void main(String[] args){
int maxslot = 0, minslot = 0, dis1, dis2, dis3, result;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
//find min and max
for(int i = 0; i < n; i++){
int m = sc.nextInt();
List<Integer> list = new ArrayList<>();
for(int j = 0; j < m; j++){
int a = sc.nextInt();
list.add(a);
if(a == m){
maxslot = j;
}
if(a == 1){
minslot = j;
}
}
//get distance
if(minslot<maxslot){
dis1 = minslot + 1;
dis2 = maxslot - minslot;
dis3 = m-maxslot;
}
else{
dis1 = maxslot + 1;
dis2 = minslot - maxslot;
dis3 = m-minslot;
}
//get shortest distance
List<Integer> dist_list = new ArrayList<>();
dist_list.add(dis1);
dist_list.add(dis2);
dist_list.add(dis3);
Collections.sort(dist_list);
result = dist_list.get(0) + dist_list.get(1);
System.out.println(result);
}
}
}
n = int (input ())
arr =[]
#find min and max
for i in range(n):
m = int(input())
arr = list(map(int, input().split()))
for j in range(m):
if arr[j] == m:
maxslot = j
if arr[j] == 1:
minslot = j
mid = m / 2
#get distance
if minslot < maxslot:
dis1 = minslot + 1
dis2 = maxslot - minslot
dis3 = m - maxslot
else:
dis1 = maxslot + 1
dis2 = minslot - maxslot
dis3 = m - minslot
#get shortest distance
dist_list = [dis1, dis2, dis3]
dist_list = sorted(dist_list)
result = dist_list[0] + dist_list[1]
print(result)
문제 출처
반응형
'Coding > CODEFORCES' 카테고리의 다른 글
[코드포스 CODEFORCES] 339A Helpful Maths 풀이 코드 (C/C++/Java /Python) (0) | 2021.08.25 |
---|---|
[코드포스 CODEFORCES] 1511A Review Site 풀이 코드 (C/C++/Java /Python) (0) | 2021.08.23 |
[코드포스 CODEFORCES] 263A Beautiful Matrix 풀이 코드 (C/C++/Java /Python) (0) | 2021.08.03 |
[코드포스 CODEFORCES] 112A Petya and Strings 풀이 코드 (C/C++/Java /Python) (0) | 2021.08.01 |
[코드포스 CODEFORCES] 282A Bit++ 풀이 코드 (C/C++/Java /Python) (0) | 2021.07.27 |