Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // CDJ_ Ratatouille.cpp
- // algorithm
- //
- // Created by hubring on 2019. 2. 16..
- // Copyright © 2019년 hubring. All rights reserved.
- //
- #include <stdio.h>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- int N, P;
- int pack[51][51];
- int ingredient[51];
- int startIdx[51];
- float usePack(int ing, int pack, int quot){
- int remain = pack - (ing*quot);
- float per = (remain*100)/(float)(ing*quot);
- return per;
- }
- int getMaxPackage(){
- int res = 0, quot = 1;
- //몫(quot)을 1부터 시작하여 만들 수 있는 요리의 개수를 구한다.
- //몫의 최대 크기는 (최대 성분 * 몫 * 110%) <= (최대 성분의 패키지 종량)을 넘지 않는다.
- while(true){
- int cnt = 0;
- for(int i=0; i<N; i++){
- int inRangeIdx = -1;
- for(int j =startIdx[i]; j<P; j++){
- // i번째 성분을 quet개 만들때 최소 90% 범위 내 패키지 종량을 찾는다.
- if(usePack(ingredient[i], pack[i][j],quot)>=-10){
- inRangeIdx = j;
- break;
- }
- }
- //최소 90퍼 범위 내에 패키지 종량이 없다면 더이상 요리를 만들 수 없으므로 결과를 리턴한다.
- if(inRangeIdx==-1) return res;
- //사용가능한 inRangeIdx를 시작지점으로 설정한다.
- startIdx[i] = inRangeIdx;
- //해당 110% 범위 내에 패키지 종량이 있다면 해당 패키지로 quet개의 요리를 할 수 있으므로 cnt를 증가시킨다.
- if(usePack(ingredient[i], pack[i][inRangeIdx],quot)<=10){
- cnt++;
- }
- }
- //요리 quet개 만들때 필요 성분 N개를 모두 만족하므로 결과 횟수를 증가시킨다.
- if(cnt == N){
- res++;
- //해당 startIdx[i]번쩨에 있는 패키지는 사용했으므로 다음번째로 시작할 수 있도록 설정한다.
- for(int i =0; i<N; i++){
- startIdx[i]++;
- }
- }else{
- quot++;
- }
- }
- return res;
- }
- void solve(int testNum){
- scanf("%d %d", &N, &P);
- for(int i=0; i<N; i++){
- scanf("%d", &ingredient[i]);
- startIdx[i] =0;
- }
- for(int i=0; i<N; i++){
- for(int j =0; j<P; j++){
- scanf("%d", &pack[i][j]);
- }
- // package를 오름차순으로 정렬한다.
- sort(pack[i], pack[i]+P);
- }
- printf("Case #%d: %d\n", testNum, getMaxPackage());
- }
- int main(){
- int testCase;
- scanf("%d", &testCase);
- for(int i=0 ;i<testCase; i++){
- solve(i+1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement