BOJ
[BOJ] 수학 1(1)
orangecalculator
2020. 7. 24. 01:04
슬슬 조금이나마 어려워지고 있습니다.
[BOJ 1712]
몸풀기 잘했습니다. 고정비용을 판매당 순이익으로 나눠주면 됩니다. 무조건 총순이익이 (+)가 돼야 하기 때문에 +1을 해줍니다.
#include <stdio.h>
int breakevenpoint(int fixcost, int varcost, int pergain){
if(varcost >= pergain)
return -1;
else{
int perincome = pergain - varcost;
return (fixcost / perincome) + 1;
}
}
int main(){
int A, B, C;
scanf("%d%d%d",&A,&B,&C);
printf("%d",breakevenpoint(A,B,C));
}
[BOJ 2839]
일단 최대한 5킬로짜리로 채워봅니다. 안 맞을 때마다 5킬로 하나씩을 다시 풀어서 3킬로짜리로 맞춰지는지 봅니다. 5킬로짜리를 3개 풀면 어차피 그 차이가 3의 배수라 의미가 없습니다. 3번 해보고 안되면 끊어줍니다.
#include <stdio.h>
int divweight(int weight){
const int option1 = 5, option2 = 3;
int rem = weight % option1;
for(int k=0;k<option2;++k){
if(rem % option2 == 0) break;
rem += option1;
if(rem > weight) return -1;
}
if(rem % option2 != 0) return -1;
else return (weight - rem) / option1 + rem / option2;
}
int main(){
int W;
scanf("%d",&W);
printf("%d",divweight(W));
}
[BOJ 2292]
시작하는 지점은 1번으로 1번 만에 갈 수 있는 곳은 1번만 있습니다. 그다음 2번 만에 갈 수 있는 곳 6개 추가, 그다음 12개 추가하는 식으로 해서 세주면 됩니다.
#include <stdio.h>
int minpathroom(int roomno){
int coverage = 1;
int roomcount = 1;
for(int stepno = 1;roomno > coverage;stepno++){
coverage += stepno * 6;
roomcount++;
}
return roomcount;
}
int main(){
int R;
scanf("%d",&R);
printf("%d",minpathroom(R));
}
[BOJ 1193]
포장은 분수지만 결국에는 (X, Y) 순서쌍으로 다루어주면 됩니다. 먼저 X+Y인 순서쌍들끼리 묶어서 그룹으로 보고 몇 번째 그룹인지 찾아준 후에 그룹 안에서 몇 번째인지 보면 됩니다. 지그재그로 세어주므로 홀수(혹은 구현에 따라 짝수)인 경우에는 뒤집어주면 됩니다.
#include <stdio.h>
#include <utility>
typedef std::pair<int,int> div_t;
div_t div(int n){
int lastsum, sum = 0, groupno = 1;
do{
lastsum = sum;
sum += groupno;
groupno++;
}
while(sum < n);
div_t p;
p.first = n - lastsum;
p.second = groupno - p.first;
if(groupno % 2 == 0) std::swap(p.first, p.second);
return p;
}
int main(){
int X;
scanf("%d",&X);
div_t p = div(X);
printf("%d/%d",p.first,p.second);
}
소스가 점점 길어지는 것 같아서 여기서 한번 끊고 가겠습니다.^^