하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다.
이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고,
양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓을 수 있고,
다른 쪽에는 무게를 측정하려는 물건만 올려놓을 수 있다.
무게가 양의 정수인 N개의 저울추가 주어질 때, 이 추들을 사용하여
측정할 수 없는 양의 정수 무게 중 최소값을 구하는 프로그램을 작성하시오.
예를 들어, 무게가 각각 3, 1, 6, 2, 7, 30, 1인 7개의 저울추가 주어졌을 때,
이 추들로 측정할 수 없는 양의 정수 무게 중 최소값은 21이다.
실행 파일의 이름은 CC.EXE로 하고 실행시간은 1초를 넘을 수 없다.
부분 점수는 없다.
입력 파일의 이름은 INPUT.TXT이다. 첫 째 줄에는 저울추의 개수를 나타내는
양의 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 둘째 줄에는 저울추의
무게를 나타내는 N개의 양의 정수가 빈칸을 사이에 두고 주어진다.
각 추의 무게는 1이상 1,000,000 이하이다.
출력 파일의 이름은 OUTPUT.TXT이다. 첫째 줄에 주어진 추들로 측정할 수
없는 양의 정수 무게 중 최소값을 출력한다.
● 1≤N≤10인 경우는 전체 테스트 데이터의 30%이다.
============================================
[1] 입력된 수들을 정렬합니다.
7
3 1 6 2 7 30 1 을 정렬합니다.
-------------------------------
1 1 2 3 6 7 30
[2] 앞에서 부터 누적합을 구해갑니다.
1 2 4 7 13 20 50 [누적값]
\ \ \ \ \ \
1 1 2 3 6 7 30 [정렬된수]
[3]위에서 와 같이 누적합과 각 수를 비교해봅니다.
1 ( 2이하 수) 1
2 ( 3이하 수) 2
4 ( 5이하 수) 3
7 ( 8이하 수) 6
13 (14이하 수) 7
20 (21이하 수) 30 만족하지 않음 *** 그래서 21이 측정될수 없는 최소값이 됩니다.
============================================================
#include <stdio.h>
int main() {
FILE *f1, *f2;
int data[1000]={0,}, sums[1000]={0,};
int i, j, n, x, t;
f1=fopen("INPUT.TXT", "r");
if(f1==NULL) {
printf("INPUT.TXT파일을 읽을 수 없습니다.\n");
return 1;
}
fscanf(f1, "%d", &n);
for(i=0;i<n;i+=1) {
fscanf(f1, "%d", &data[i]);
}
fclose(f1);
f2=fopen("OUTPUT.TXT", "w");
// 선택정렬
for(i=0;i<n-1;i+=1) {
// 최소수의 인덱스 x
x=i;
for(j=i+1;j<n;j+=1) {
if(data[j]<data[x]) {
x=j;
}
}
t=data[i];
data[i]=data[x];
data[x]=t;
}
// 누적합을 구한다.
sums[0]=0;
for(i=1;i<n;i+=1) {
sums[i]=sums[i-1]+data[i-1];
}
// 해를 구한다.
for(i=0;i<n;i+=1) {
if(sums[i]+1<data[i]) {
break;
}
}
// 해를 출력한다.
if(i<n) {
fprintf(f2, "%d", sums[i]+1);
} else {
fprintf(f2, "해가 없습니다.");
}
fclose(f2);
return 0;
}
'알고리즘, 자료구조 > 알고리즘' 카테고리의 다른 글
spanning tree (신장 나무) - 신장의 뜻은? (0) | 2014.07.01 |
---|---|
동적계획법-정수의 부분합문제(subset sum problem) (0) | 2014.05.22 |
알고리즘의 정의에서 입력의 갯수0개일때도 출력의 갯수 1개이상인 이유? (0) | 2014.03.19 |
퀵정렬 알고리즘의 시간복잡도 (0) | 2014.03.05 |
2d bin packing (0) | 2014.02.26 |