Back to list of problems
Flooded!
815.c
#include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define DIM 35 int matrix[DIM * DIM]; int m,n; int flooded_regions; int level; static void msort_merge(void *base, size_t nmemb1, size_t nmemb2, size_t size, int(*compar)(const void *, const void *)) { void * copy; int i,j; copy = malloc((nmemb1 + nmemb2) * size); if (!copy) { abort(); /* should exit with error code... */ } memcpy(copy, base, (nmemb1 + nmemb2) * size); i = j = 0; for (i = j = 0; i+j < nmemb1+nmemb2; ) { if (j==nmemb2 || (i!=nmemb1 && compar((char*)copy + i*size,(char*)copy + (nmemb1+j)*size)<0)) { memcpy((char*)base + (i+j)*size, (char*)copy + i*size, size); i++; } else { memcpy((char*)base + (i+j)*size, (char*)copy + (nmemb1+j)*size, size); j++; } } } void msort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)) { if (nmemb==1) { return; } /* sort 2 parts */ msort(base, nmemb/2, size, compar); msort(((char *)(base) + (nmemb/2 * size)), nmemb - nmemb/2, size, compar); /* merge them */ msort_merge(base, nmemb/2, nmemb - nmemb/2, size, compar); } static int compar_int(const void *a, const void *b) { return *(int *)a - *(int *)b; } double calculate(void) { int i; int curlevel = level; if (level <= 0) { flooded_regions = 0; return 0.0; } for (i=0; i<m*n-1; i++) { if (100 * (i+1) * (matrix[i+1] - matrix[i]) >= curlevel) { break; } curlevel -= 100 * (i+1) * (matrix[i+1] - matrix[i]); } flooded_regions = i+1; return (double)(matrix[i]) + (double)curlevel / (double)(100 * (i+1)); } int main(void) { int region=1; int i,j; while (1) { scanf("%d %d", &m, &n); if (m==0 && n==0) { break; } for (i=0; i<m; i++) { for (j=0; j<n; j++) { scanf("%d", &matrix[i * n + j]); } } scanf("%d", &level); msort(matrix, m*n, sizeof(int), compar_int); printf("Region %d\n", region++); printf("Water level is %.2f meters.\n", calculate()); printf("%.2f percent of the region is under water.\n", 100.0 * (double)flooded_regions / (m*n)); printf("\n"); } return 0; }