86 lines
1.6 KiB
C
86 lines
1.6 KiB
C
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
|
|
#define MAX(a, b) ((a) < (b) ? (b) : (a))
|
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
|
|
|
double average(unsigned int length, unsigned int *list) {
|
|
|
|
double sum = 0.0;
|
|
|
|
/* access all the arguments assigned to valist */
|
|
for (unsigned int i = 0; i < length; i++) {
|
|
sum += list[i];
|
|
}
|
|
|
|
|
|
return sum/length;
|
|
}
|
|
|
|
unsigned int totalDistance(unsigned int crabLength, unsigned int *crabs, unsigned int target){
|
|
unsigned int totalDistance = 0;
|
|
for (unsigned int i = 0; i < crabLength; i++){
|
|
unsigned int distance = abs((int)crabs[i] - (int)target);
|
|
unsigned int cost = distance * (distance + 1) / 2;
|
|
//printf( "Move from %i to %i: %i fuel\n", crabs[i], target, cost );
|
|
totalDistance += cost;
|
|
}
|
|
return totalDistance;
|
|
}
|
|
|
|
|
|
int main( int argc, char *argv[] ){
|
|
if( argc == 2 ) {
|
|
|
|
|
|
FILE *fp=fopen(argv[1], "r");
|
|
|
|
unsigned int count=0;
|
|
unsigned int no;
|
|
char ch;
|
|
// Count the number of crab positions
|
|
while ( fscanf( fp, "%i%c", &no, &ch ) ){
|
|
count++;
|
|
if ( ch == '\n' ) break;
|
|
}
|
|
|
|
rewind(fp);
|
|
|
|
unsigned int min = ~0;
|
|
unsigned int max = 0;
|
|
unsigned int crabs[count];
|
|
|
|
for (unsigned int i= 0; i<count; i++ ){
|
|
fscanf( fp, "%i%c", &no, &ch );
|
|
crabs[i] = no;
|
|
min = MIN( min, no );
|
|
max = MAX( max, no );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
unsigned int smallestCost = ~0;
|
|
for ( unsigned int i = 0; i <= max; i++ ){
|
|
smallestCost = MIN( smallestCost, totalDistance( count, crabs, i ) );
|
|
}
|
|
|
|
|
|
printf("Smallest Cost: %i\n", smallestCost);
|
|
|
|
|
|
|
|
|
|
fclose(fp);
|
|
|
|
|
|
|
|
return 0;
|
|
} else {
|
|
printf("You need to provide a file\n");
|
|
return 1;
|
|
}
|
|
}
|