main.cc 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <algorithm>
  2. #include <climits>
  3. #include <cmath>
  4. #include <cstdio>
  5. using std::sort;
  6. const char fmt[] = "Region %d\nWater level is %.2f meters.\n%.2f percent of the region is under water.\n";
  7. const int N = 30;
  8. const int SQR = 100;
  9. int hei[N * N];
  10. int sum[N * N];
  11. int m, n, mn, vol;
  12. int first_ge() {
  13. int s = 0, e = mn - 1;
  14. while (s <= e) {
  15. int m = s + (e - s) / 2;
  16. if (sum[m] < vol) s = m + 1;
  17. else e = m - 1;
  18. }
  19. return s;
  20. }
  21. int main() {
  22. int rid = 1;
  23. while (scanf("%d %d", &m, &n) != EOF) {
  24. if (m == 0 && n == 0) break;
  25. mn = m * n;
  26. for (int i = 0; i < mn; i++) scanf("%d", &hei[i]);
  27. scanf("%d", &vol);
  28. sort(hei, hei + mn);
  29. for (int i = 0; i < mn - 1; i++) {
  30. sum[i] = (hei[i + 1] - hei[i]) * SQR * (i + 1);
  31. if (i != 0) sum[i] += sum[i - 1];
  32. }
  33. sum[mn - 1] = INT_MAX;
  34. int i = first_ge();
  35. double lv = hei[i];
  36. vol = i == 0 ? vol : vol - sum[i - 1];
  37. lv += double(vol) / ((i + 1) * SQR);
  38. printf(fmt, rid++, lv, (i + 1) * 100.0 / mn);
  39. }
  40. return 0;
  41. }