반응형
종이자르기
|
출처 : 2001 KOI 초등부 1번 |
#include<stdio.h> #include<stdlib.h> int Proc() { int CutCount = 0; ⁄⁄종이를 자를 횟수 카운트 int HMax = 0; ⁄⁄종이의 세로 길이 int WMax = 0; ⁄⁄종이의 가로 길이 int HWCheck = 0; ⁄⁄가로,세로 컷팅 방향 정하는 flag int CutPoint = 0; ⁄⁄자르는 지점 int Hlenght = 0; ⁄⁄세로의 가장 큰 길이 int wlenght = 0; ⁄⁄가로의 가장 큰 길이 int result = 0; ⁄⁄가장 넓은 면적 FILE *fd; fd = fopen("input.txt", "r"); fscanf(fd, "%d %d\n", &WMax, &HMax); fscanf(fd, "%d\n", &CutCount); ⁄⁄동적 배열을 사용하면 종이의 크기가 변해도 상관 없다. int *height = (int*)malloc(sizeof(int)*(HMax+1)); ⁄⁄자를 지점 저장 동적배열. (세로) int *width = (int*)malloc(sizeof(int)*(WMax+1)); ⁄⁄자를 지점 저장 동적배열. (가로) height[HMax]=1; ⁄⁄종이의 끝을 표시 (세로) width[WMax]=1; ⁄⁄종이의 끝을 표시 (가로) for(int i=0; i<CutCount+1; i++) { fscanf(fd, "%d %d\n", &HWCheck, &CutPoint); if(HWCheck==0) { height[CutPoint]=1; } else if(HWCheck==1) { width[CutPoint]=1; } } CutPoint=0; ⁄⁄자르기 시작 할 지점 초기화 for(int i=1; i<(HMax+1); i++) { if(height[i]==1) { if(Hlenght<(i-CutPoint)) ⁄⁄이전의 자른 길이와 지금 자른 길이를 비교. (세로) Hlenght=(i-CutPoint); CutPoint=i; ⁄⁄자른 지점을 저장 } } for(int i=1; i<(WMax+1); i++) { if(width[i]==1) { if(wlenght<(i-CutPoint)) ⁄⁄이전의 자른 길이와 지금 자른 길이를 비교. (가로) wlenght=(i-CutPoint); CutPoint=i; ⁄⁄자른 지점을 저장 } } free(height); ⁄⁄동적 배열 해제 free(width); ⁄⁄동적 배열 해제 fclose(fd); return wlenght*Hlenght; } void output(int result) { FILE *fd; fd = fopen("output.txt", "w"); fprintf(fd,"%d", result); fclose(fd); } void main(void) { int s = Proc(); output(s); }
반응형
'Algorithms' 카테고리의 다른 글
인수분해(insubunE) (0) | 2014.09.04 |
---|---|
최대 공약수(GCD), 최소 공배수(LCM) (0) | 2014.09.03 |
[정올]동전 자판기 (0) | 2014.09.01 |
[정올]저글링 방사능 오염 (0) | 2014.09.01 |
[리스트: LIST] - 노드(Node) (0) | 2013.08.04 |