A. Nastya and Rice

문제

예시

[input]
5
7 20 3 101 18
11 11 10 234 2
8 9 7 250 122
19 41 21 321 10
3 10 8 6 1

[output]
Yes
No
Yes
No
Yes

답1 – 이곳을 클릭하면 정답이 보입니다
def answer(riceCount, a, b, c, d):
    if a+b == 0 or c+d == 0:
        return "NO"
    if (a+b)*riceCount < c-d:
        return "NO"
    if (a-b)*riceCount <= c+d:
        return "YES"
    return "NO"
    
n = int(input())
for _ in range(n):
    riceCount, a, b, c, d = map(int, input().split())
    print(answer(riceCount, a, b, c, d))

설명

답2 – 이곳을 클릭하면 정답이 보입니다

설명

B. Nastya and Door

문제

예시

[input]
5
8 6
1 2 4 1 2 4 1 2
5 3
3 2 3 2 1
10 4
4 3 4 3 2 3 2 1 0 1
15 7
3 7 4 8 2 3 4 5 21 2 3 4 2 1 3
7 5
1 2 3 4 5 6 1

[output]
3 2
2 2
2 1
3 1
2 3

답1 – 여기를 클릭하면 정답이 보입니다
def findPeaks(arr):
    peaks = []
    for i in range(1, len(arr)-1):
        el = arr[i]
        if arr[i-1] < el and el > arr[i+1]:
            peaks.append(i+1)
    return peaks
def answer(arr, k):
    peaks = findPeaks(arr)
    if len(peaks) == 0:
        return "1 1"
    maxRange = []
    for i in range(len(peaks)):
        _range = [peaks[i]-1]
        for j in range(i, len(peaks)):
            if (peaks[j]+1) - (peaks[i]-1) + 1 <= k:
                _range.append(peaks[j]+1)
            else:
                break
        if len(_range) > len(maxRange):
            maxRange = _range
    
    _len = maxRange[-1] - maxRange[0] + 1
    if _len < k:
        maxRange[0] -= (k - _len)
        if maxRange[0] < 1:
            maxRange[0] = 1
    return (str(len(maxRange)) + " " + str(maxRange[0]))
    
testCount = int(input())
for _ in range(testCount):
    n, k = map(int, input().split())
    arr = list(map(int, input().split()))
    print(answer(arr, k))

답은 맞는데, 시간초과 뜬다

답2 – 여기를 클릭하면 정답이 보입니다
# error : expected 7 but 5 found

def findPeaks(arr):
    peaks = []
    for i in range(1, len(arr)-1):
        el = arr[i]
        if arr[i-1] < el and el > arr[i+1]:
            peaks.append(i+1)
    return peaks

def getLen(arr, a, b):
    return (arr[b]+1) - (arr[a]-1) + 1

def getLeft(arr, leftIndex, _max, k):
    _len = getLen(arr, leftIndex, leftIndex+_max-1)
    rest = k - _len
    left = arr[leftIndex]-1
    if rest > 0:
        left -= rest
        if left < 1: left = 1
    return left

def answer(arr, k):
    peaks = findPeaks(arr)
    if len(peaks) == 0: return "1 1"
    leftIndex = 0
    _max = 1
    count = 0
    startPoint = 0
    for i in range(len(peaks)):
        for j in range(startPoint, len(peaks)):
            _len = getLen(peaks, i, j)
            if k >= _len:
                count += 1
                startPoint = j
            if k < _len:
                startPoint = j
                break
        if _max < count:
            _max = count
            leftIndex = i
        count = max(0, count-1)

    left = getLeft(peaks, leftIndex, _max, k)
    return str(_max+1) + " " + str(left)
    
testCount = int(input())
for _ in range(testCount):
    n, k = map(int, input().split())
    arr = list(map(int, input().split()))
    print(answer(arr, k))

한 6번 수정해서 겨우 맞았다. 방어코드 한줄 때문에 작동이 안되었던거였다!

C.

문제

예시

[input]

[output]

답1 – 여기를 클릭하면 정답이 보입니다

설명

답2 – 여기를 클릭하면 정답이 보입니다