main.cc 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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 = m * n - 1;
  14. while (s <= e) {
  15. int m = s + (e - s) / 2;
  16. if (sum[m] < vol) {
  17. s = m + 1;
  18. } else {
  19. e = m - 1;
  20. }
  21. }
  22. return s;
  23. }
  24. int main() {
  25. int rid = 1;
  26. while (scanf("%d %d", &m, &n) != EOF) {
  27. if (m == 0 && n == 0) break;
  28. for (int i = 0; i < m; i++)
  29. for (int j = 0; j < n; j++)
  30. scanf("%d", &hei[i * n + j]);
  31. scanf("%d", &vol);
  32. mn = m * n;
  33. sort(hei, hei + mn);
  34. for (int i = 0; i < mn - 1; i++) {
  35. sum[i] = (hei[i + 1] - hei[i]) * SQR * (i + 1);
  36. if (i != 0) sum[i] += sum[i - 1];
  37. }
  38. sum[mn - 1] = INT_MAX;
  39. int i = first_ge();
  40. double lv = hei[i];
  41. vol = i == 0 ? vol : vol - sum[i - 1];
  42. lv += double(vol) / ((i + 1) * SQR);
  43. printf(fmt, rid++, lv, (i + 1) * 100 / double(mn));
  44. }
  45. return 0;
  46. }