#include <stdio.h>
#include <stdlib.h>
typedef struct _Book{
int price;
int point;
}Book;
// 북을 생성합니다. 문제에 보면 책목록을 위한 n과 서점의 갯수를 위한 M이 있는데, 그대로 쓴것입니다.
// 생성을 위한 동적할당 부분.
Book **createBook(int M, int N)
{
Book **pNew = NULL;
int i =0;
pNew = (Book **)malloc(sizeof(Book *)*M);
if(pNew == NULL)
{
return NULL;
}
pNew[0] = (Book *)malloc(sizeof(Book)*M*N);
if(pNew[0] == NULL)
{
free(pNew);
return NULL;
}
for(i=1; i<M; ++i)
{
pNew[i] = pNew[i-1] + N;
}
return pNew;
}
// 동적할당 해제
void deleteBook(Book **pMat)
{
free(pMat[0]);
free(pMat);
}
// book의 정보를 set합니다.
// 문제에 보면 입력이 책마다로 되어있어 이용하기 힘들다 생각하여, 행과 열을 바꿔서 서점마다로 바깟습니다.
void setBook(Book **pMat, int M, int N)
{
int i =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);
}
}
}
// 그저 출력
void printBook(Book **pMat, int M, int N)
{
int i =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은 책의 수이고요.
int minPrice(Book *pArr, int N)
{
int ret = 0; // 결과 반환을 위해
int minPoint =pArr[0].point; // 포인트값의 최소찾기.
int i = 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;
return ret;
}
int main()
{
int C =0, N=0, M=0;
int i =0;
int tmp =0;
int j =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);
return 0;
}
biosvos
13년 전