소ê°� ¶
ì�¼ì¢…ì�˜ ì‚°ìˆ˜ë¬¸ì œ 같기ë�„ í•˜ê³ ,
수ì‹�ì�„ ìƒ�ê°�하는것ì�€ ì–´ë µì§€ 않았지만
프로그램� 실행시간� 줄�는� 시간� 들었다.
프로그램� 다�과 같� �리로 �작한다.
ex)
43
1 3 -> 개당수납비용� 최소
2 4
�때 n = bq+r �용
43 = 14*3+1 = 3333333333333+3+1 = 3333333333333+4 => 13, 1
수ì‹�ì�„ ìƒ�ê°�하는것ì�€ ì–´ë µì§€ 않았지만
프로그램� 실행시간� 줄�는� 시간� 들었다.
프로그램� 다�과 같� �리로 �작한다.
ex)
43
1 3 -> 개당수납비용� 최소
2 4
�때 n = bq+r �용
43 = 14*3+1 = 3333333333333+3+1 = 3333333333333+4 => 13, 1
35
1 5 -> 개당수납비용� 최소
20 7
�때
35 = 7*5+0 = 5555555+0 =>7, 0
1 5 -> 개당수납비용� 최소
20 7
�때
35 = 7*5+0 = 5555555+0 =>7, 0
<ìˆ˜ì • 05 05 15>
ì�´ 프로그램ì�˜ 약ì �ì�€ n2ì�˜ í�¬ê¸°ê°€ 커지면 실행시간ì�´ 늘어난다는 ì �ì�´ë‹¤.
n2가 작� 수�면 금방 �나지만 다�과 같� worst case�때는 약 몇억번� 루프를 �아야 한다.
2000000000
1 3
1900000000 1900000000
ê·¸ ì �ì�„ ìˆ˜ì •í•˜ì—¬ 굉장히 ë¹ ë¥¸ ì†�ë�„로 처리 가능하게 함. ë�•ë¶„ì—� 코드가 복잡해ì§�;;
ì•„.. ìˆ˜ì •í›„ 버그ì†�ì¶œ ã… ã…
ì�´ 프로그램ì�˜ 약ì �ì�€ n2ì�˜ í�¬ê¸°ê°€ 커지면 실행시간ì�´ 늘어난다는 ì �ì�´ë‹¤.
n2가 작� 수�면 금방 �나지만 다�과 같� worst case�때는 약 몇억번� 루프를 �아야 한다.
2000000000
1 3
1900000000 1900000000
ê·¸ ì �ì�„ ìˆ˜ì •í•˜ì—¬ 굉장히 ë¹ ë¥¸ ì†�ë�„로 처리 가능하게 함. ë�•ë¶„ì—� 코드가 복잡해ì§�;;
ì•„.. ìˆ˜ì •í›„ 버그ì†�ì¶œ ã… ã…
코드 ¶
~cpp
#include <iostream>
using namespace std;
void main(){
int N[100], n1[100], c1[100], n2[100], c2[100];
int tot_arr = 0;
for(int i=0;i<100;i++){
cin >> N[i];
if(N[i] == 0)
break;
cin >> c1[i]>> n1[i]>> c2[i] >> n2[i];
tot_arr++;
}
for(i=0;i<tot_arr;i++){
if(c1[i]/(double)n1[i] > c2[i]/(double)n2[i]) //n1� 개당수납비용� 최소� ��가 오게함.
swap(n1[i],n2[i]);
int r = N[i]%n1[i];
int m1 = N[i]/n1[i];
int m2 = -1;
for(int k=0; k<=n2[i] ;k++){
if(r%n2[i]==0){
m2=r/n2[i];
cout <<n1[i]<<"들�박스 "<<m1<<"개 필요 "<<n2[i]<<"들�박스 "<<m2<<"개 필요 "<<"\n";
break;
}
r = ((n2[i]/n1[i]==0?1:n2[i]/n1[i])*k+1)*n1[i] + (N[i]%n1[i]); //r� n2보다 � 가장 작� n1� 배수� N[i]%n1[i]� �한 값.
if(r-n2[i]>=n1[i])
r-=n1[i];
if(r>N[i] || r<0){
int tempk;
if(n2[i]*k>N[i])
tempk = k-1;
else
tempk = k;
if((N[i]-n2[i]*tempk)%n1[i] == 0)
r = n2[i]*tempk;
else
break;
}
m1=(N[i]-r)/n1[i];
}
if(m2 == -1)
cout << "failed\n";
cout <<"total " << k << " roops\n";
}
}
ìˆ˜ì • ì „
~cpp
#include <iostream>
using namespace std;
void main(){
int N[100], n1[100], c1[100], n2[100], c2[100];
int tot_arr = 0;
for(int i=0;i<100;i++){
cin >> N[i];
if(N[i] == 0)
break;
cin >> c1[i]>> n1[i]>> c2[i] >> n2[i];
tot_arr++;
}
for(i=0;i<tot_arr;i++){
if(c1[i]/(double)n1[i] > c2[i]/(double)n2[i]) //n1� 개당수납비용� 최소� ��가 오게함.
swap(n1[i],n2[i]);
int r = N[i]%n1[i];
int m1 = N[i]/n1[i];
int m2 = -1;
for(int roop=0; roop<=n2[i] ; roop++){ //루프는 n2만� �린다. 아래�서 r� n1� n2만� �해지면 n2*n1+r� �며
//ì�´ëŠ” (n2*n1+r)%n2 == r%n2ê°€ ë�˜ê¸° 때문ì—� roop=n2ì�´í›„부터는 ì�´ì „것ì�˜ 순환ì�´ ë�œë‹¤.
if(r%n2[i]==0){
m2=r/n2[i];
cout <<n1[i]<<"들�박스 "<<m1<<"개 필요 "<<n2[i]<<"들�박스 "<<m2<<"개 필요 "<<"\n";
break;
}
r+=n1[i];
m1--;
}
if(m2 == -1)
cout << "failed\n";
}
}










