【Python】ceil(A)-1 == floor(A-1)이 성립하는 조건 【AtCoder】
여기 최근 쭉 머리 속에 있던 모야모야가 드디어 잡혔다! ! !
그래서 기사로 해보자.
결론
ceil(A)-1 == floor(A-1)
가 성립하는 조건은,
입니다.
그렇다고해도 뭐야 몰라! 된다고 생각하기 때문에 예제.
예제
1:2.8~4.2で整数は何個あるでしょう?
2:2.0~4.2で整数は何個あるでしょう?
3:14~21で5の倍数は何個あるでしょう?
4:10~21で5の倍数は何個あるでしょう?
5:9mの丸太を3mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
6:9mの丸太を2mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
7:9mの丸太を1mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
해설 1
1:2.8~4.2で整数は何個あるでしょう?
이 문제는
'2.8'을 올리고 '3'
'4.2'를 자르고 '4'
그렇게함으로써
라는 문제에 귀착할 수 있습니다.
よって、4 - 3 + 1(調整) = 2個 が答えとなります。
해설 2
2:2.0~4.2で整数は何個あるでしょう?
이것은 왼쪽의 절상 부분이 「2」라고 정수이므로 간단하네요!
よって、4 - 2 + 1(調整) = 3個 が答えとなります。
해설 3
3:14~21で5の倍数は何個あるでしょう?
이 문제는 크게 두 가지 해법이 있다고 생각합니다.
해법 1(1을 당겨 절단)
누적 합시의 생각과 비슷하지만,
"21"의 5의 배수 개수 - "13"(=14-1)의 5의 배수의 개수
라고 생각함으로써,
よって、4 - 2 = 2個 が答えとなります。
해법 2
14~21을 5로 나누어 정수의 수를 세는 문제에 귀착시키는 방법입니다.
그러면
1:2.8~4.2에서 정수는 몇개 있나요?
같은 문제가됩니다.
よって、4 - 3 + 1(調整) = 2個 が答えとなります。
해설 4
4:10~21で5の倍数は何個あるでしょう?
해법 1(1을 당겨 절단)
よって、4 - 1 = 3個 が答えとなります。
해법 2
10~21을 5로 나누어 정수의 수를 세는 문제에 귀착시키면,
2:2.0~4.2에서 정수는 몇개 있나요?
같은 문제가됩니다.
よって、4 - 2 + 1(調整) = 3個 が答えとなります。
여기까지 요약
1:2.8~4.2で整数は何個あるでしょう?
2:2.0~4.2で整数は何個あるでしょう?
3:14~21で5の倍数は何個あるでしょう?
4:10~21で5の倍数は何個あるでしょう?
3이나 4와 같은 문제를 잡는 경우는, 해법 1을 사용하면 모두 잘라내기만으로 생각할 수 있습니다.
또, 절상은 조정분의 고려가 필요하고,
프로그램적으로도 python에서는 잘라내기를 //
로만 표현할 수 있으므로, 가능하면 모두 해법 1의 「1을 당겨 자르기」로 처리하고 싶습니다.
test.py#3:14~21で5の倍数は何個あるでしょう?
#解法1(1を引いて切捨)
ans = 21//5
ans -= 13//5
print(ans) #2
#解法2(切上-1)
import math
ans = 21//5
ans -= math.ceil(13/5)-1 #ans -= -(-13//5)-1とするのも一つ。
print(ans) #2
그러나...
소수의 경우는, 「1을 당겨 절단」을 사용할 수 없다! ! !
입니다.
실제로 시도해 봅시다.
대답 '2'
해야 할 1문제의 문제를 해법 1, 2로 각각 풀어봅니다.
test.py#1:2.8~4.2で整数は何個あるでしょう?
#解法1(1を引いて切捨)
ans = 4.2//1
ans -= 1.8//1
print(ans) #3.0 →本当は2が正しい!!!!!!!!!!!
#解法2(切上-1)
import math
ans = 4.2//1
ans -= math.ceil(2.8/1)-1
print(ans) #2.0 →正しい結果となった。
다시 결론
ceil(A)-1 == floor(A-1)
가 성립하는 조건은,
1:2.8~4.2で整数は何個あるでしょう?
2:2.0~4.2で整数は何個あるでしょう?
3:14~21で5の倍数は何個あるでしょう?
4:10~21で5の倍数は何個あるでしょう?
#3:14~21で5の倍数は何個あるでしょう?
#解法1(1を引いて切捨)
ans = 21//5
ans -= 13//5
print(ans) #2
#解法2(切上-1)
import math
ans = 21//5
ans -= math.ceil(13/5)-1 #ans -= -(-13//5)-1とするのも一つ。
print(ans) #2
#1:2.8~4.2で整数は何個あるでしょう?
#解法1(1を引いて切捨)
ans = 4.2//1
ans -= 1.8//1
print(ans) #3.0 →本当は2が正しい!!!!!!!!!!!
#解法2(切上-1)
import math
ans = 4.2//1
ans -= math.ceil(2.8/1)-1
print(ans) #2.0 →正しい結果となった。
ceil(A)-1 == floor(A-1)
가 성립하는 조건은,입니다.
1:2.8~4.2で整数は何個あるでしょう?
2:2.0~4.2で整数は何個あるでしょう?
3:14~21で5の倍数は何個あるでしょう?
4:10~21で5の倍数は何個あるでしょう?
1→「2.8」이 소수이므로
ceil(A)-1 == floor(A-1)
는 성립되지 않습니다.따라서 절상을 솔직하게 사용합시다.
소수의 세계에 「1」이라고 하는(차원이 다른) 정수를 마음대로 당기거나 하면 그것은 이상하게 될 거야!
2,3,4→「2.0」「14」「10」이 정수이므로
ceil(A)-1 == floor(A-1)
가 성립합니다.따라서 "1을 당겨 자르기"의 생각이 가능합니다! ! !
※ 물론, 절상을 사용해도 풀 수 있습니다.
설명5,6,7
5:9mの丸太を3mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
6:9mの丸太を2mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
7:9mの丸太を1mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
고찰하면, 틈의 개수는 「절상-1(조정)」로 구할 수 있다는 것을 알 수 있습니다.
그리고, 「절상-1」이라고 하면 「1을 당겨 절단」입니다!
이번에는 '9'가 정수이므로 '1을 당겨 자르기'로 대답을 구할 수 있습니다! ! !
よってそれぞれ5,6,7の答えは、
#5
8//3 = 2
#6
8//2 = 4
#7
8//1 = 8
となります!!!
대단해! ! !
이 굉장함, 감동! ! ! 전해질까・・・전해 주었으면 한다! ! !
덤 (연습 문제)
꼭 풀어 봅시다!
ABC131 C - Anti-Division (Diff:518)
ABC174 E - E - Logs (Diff:1227)
끝!
Reference
이 문제에 관하여(【Python】ceil(A)-1 == floor(A-1)이 성립하는 조건 【AtCoder】), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ether2420/items/882d8f77dc06c733a599텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)