#include <stdio.h>#include <stdlib.h>typedefstruct_Book{intprice;intpoint;}Book;// 북을 생성합니다. 문제에 보면 책목록을 위한 n과 서점의 갯수를 위한 M이 있는데, 그대로 쓴것입니다.// 생성을 위한 동적할당 부분.Book**createBook(intM,intN){Book**pNew=NULL;inti=0;pNew=(Book**)malloc(sizeof(Book*)*M);if(pNew==NULL){returnNULL;}pNew[0]=(Book*)malloc(sizeof(Book)*M*N);if(pNew[0]==NULL){free(pNew);returnNULL;}for(i=1;i<M;++i){pNew[i]=pNew[i-1]+N;}returnpNew;}// 동적할당 해제voiddeleteBook(Book**pMat){free(pMat[0]);free(pMat);}// book의 정보를 set합니다.// 문제에 보면 입력이 책마다로 되어있어 이용하기 힘들다 생각하여, 행과 열을 바꿔서 서점마다로 바깟습니다.voidsetBook(Book**pMat,intM,intN){inti=0,j=0;for(i=0;i<N;++i){for(j=0;j<M;++j){scanf("%d %d",&pMat[j][i].price,&pMat[j][i].point);}}}// 그저 출력voidprintBook(Book**pMat,intM,intN){inti=0,j=0;for(i=0;i<M;++i){for(j=0;j<N;++j){printf("%d %d",pMat[i][j].price,pMat[i][j].point);}}}//나눠서 정복하라는 명언을 토대로 나눈것인데,// 위에 보시면 제가 행열을 바꿔서 저장했으니,// 아래와 같이 포인터로 받을 수 있습니다.// N은 책의 수이고요.intminPrice(Book*pArr,intN){intret=0;// 결과 반환을 위해intminPoint=pArr[0].point;// 포인트값의 최소찾기.inti=0;for(i=0;i<N;++i){ret+=pArr[i].price-pArr[i].point;// 책을 구입할때, 포인터를 빼서 구입합니다.// 하지만 나머지 포인트는 버려야 하기 때문에// 아래에서 처럼 가장 작은 포인트를 버리기 위해 더하는 것입니다.if(pArr[i].point<minPoint){minPoint=pArr[i].point;}}ret+=minPoint;returnret;}intmain(){intC=0,N=0,M=0;inti=0;inttmp=0;intj=0;int*min=NULL;Book**pNew=NULL;scanf("%d",&C);min=(int*)malloc(sizeof(int)*C);for(j=0;j<C;++j){scanf("%d %d",&N,&M);pNew=createBook(M,N);setBook(pNew,M,N);min[j]=minPrice(pNew[0],N);for(i=0;i<M;++i){tmp=minPrice(pNew[i],N);if(min[j]>tmp){min[j]=tmp;}}deleteBook(pNew);}for(i=0;i<C;++i){printf("%d\n",min[i]);}free(min);return0;}
biosvos
11년 전