2008年5期题目解答

来源:互联网 发布:淘宝的海淘在哪里 编辑:程序博客网 时间:2024/05/02 02:36

溢水鱼缸 

为了能够更快加水,在鱼缸上面放m个水龙头,每个水龙头的位置都在某两个相邻的隔板中间,且高度高于两边侧面。已知没有两个水龙头的位置相同。初始时鱼缸是空的,m个水龙头同时开始流水,每个水龙头的流速都是每秒1(单位3)。我们想知道,经过多长时间后水才会从最左边或最右边的隔板处溢出鱼缸。

输入格式:从键盘输入若干组数据。每组数据有3行。第一行为两个正整数nm (0 < n, m ≤ 1000000, m ≤ n),分别表示鱼缸的长度和水龙头的个数。第二行为n+1个互不相同的正整数,顺序表示从左到右每个隔板的高度。所有的高度都不超过10000000。第三行为m个互不相同的正整数X1, X2, …, Xm,分别表示m个水龙头的位置。第i个数Xi表示第i个水龙头是在第Xi个隔板与第Xi+1个隔板之间。水龙头是按从左至右给出的,也就是输入数据保证0<=X1<X2<…<Xm。输入为0 0表示结束。

输出格式:输出到屏幕。对于每一组数据,输出结果占一行。输出一个实数,表示水开始溢出鱼缸的时间。在计算时,忽略隔板的厚度,结果保留3位小数。

【样例输入】

4 2

2 3 5 1 4

1 2

10 1

5 80 57 82 36 98 62 50 12 96 83

6

0 0

 

【样例输出】

5.000

467.000

 

 

 #include <iostream>
#include <limits>
#include <iomanip>
using namespace std;

int main()
{
 int n, m; // 鱼缸长度和水龙头个数
 for (;;)
 {
  cin >> n >> m;
  if (n == 0 && m == 0) // 数据结束
   break;
  
  int *H = new int[n+1]; // 隔板高度
  int *X = new int[m]; // 水龙头位置

  for (int i = 0; i <= n; i++)
   cin >> H[i];
  for (int i = 0; i < m; i++)
   cin >> X[i];

  int maxHP = 0;    // 最高隔板的位置
  for (int i = 1; i <= n; i++)
   if (H[i] > H[maxHP])
    maxHP = i;

  double minTime = numeric_limits<double>::max(); // 最短溢水时间
  double V = 0;  // 之前所有阶梯状区域的蓄水量
  int leftP = 0;  // 前一层阶梯区域的右侧隔板位置,即新一层阶梯区域的左侧隔板位置
  int nextX = 0;  // 下一个要考虑位置的水龙头编号

  while (leftP < maxHP) // 不超过最高隔板
  {
   // 查找新一层阶梯区域的右侧位置
   int rightP = leftP + 1; // 新一层阶梯区域的右侧隔板位置
   while (H[rightP] < H[leftP]) rightP++; // 找到比左侧高的隔板作为右侧
   for (; nextX < m && X[nextX] < rightP; nextX++); // 确定区域内的水龙头

   V += H[leftP] * (double)(rightP - leftP); // 新增蓄水量
   if (nextX != 0 && V / nextX < minTime) // 更新最短溢水时间
    minTime = V / nextX;
   
   leftP = rightP;  // 递推条件
  }

  V = 0;
  int rightP = n; // 前一层阶梯区域的左侧隔板位置,即新一层阶梯区域的右侧隔板位置
  nextX = m - 1; // 下一个要考虑位置的水龙头编号

  while (rightP > maxHP) // 不超过最高隔板
  {
   int leftP = rightP - 1; // 新一层阶梯区域的左侧隔板位置
   while (H[leftP] < H[rightP]) leftP--; // 找到比右侧高的隔板作为左侧
   for (; nextX >= 0 && X[nextX] > leftP; nextX--); // 确定区域内的水龙头

   V += H[rightP] * (double)(rightP - leftP); // 新增蓄水量
   if (nextX != m-1 && V / (m - 1 - nextX) < minTime) // 更新最短溢水时间
    minTime = V / (m - 1 - nextX);

   rightP = leftP;  // 递推条件
  }
  
  cout << fixed << setprecision(3) << minTime << endl;

  delete []H;
  delete []X;

 }
 return 0;
}

 

 

 

 

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 断奶孩子晚上哭的厉害怎么办 喜欢咬指甲的人怎么办? 成年了还咬指甲怎么办 戒奶乳房有硬块怎么办 戒奶七天有硬块怎么办 两岁宝宝喘气粗怎么办 两岁宝宝断不了奶怎么办 两岁宝宝不愿意喝奶粉怎么办 吃母乳不愿意吃奶粉怎么办 母乳宝宝不愿意喝奶粉怎么办 宝宝断母乳不喝奶粉怎么办 9个月宝宝不会爬怎么办 孩子五年级学习成绩差该怎么办 孩子临近中考学习成绩很差该怎么办 初中生成绩不好家长该怎么办 成绩差该怎么办贴吧 宝宝只会匍匐爬怎么办 一年级的孩子数学不好怎么办 小学一年级孩子数学不好怎么办 孩子上一年级数学太差怎么办 智商低情商也低怎么办? 孩子字写得很大怎么办 孩子拿笔重 写字太黑 怎么办 孩子语文成绩好数学不行怎么办? 孩子现在二年级特别叛逆怎么办 孩子又笨又蠢怎么办 四年级孩子数学计算能力差怎么办 孩子四年级数学理解能力差怎么办 孩子小学四年级数学很差怎么办 孩子做作业太慢怎么办 小学三年级数学成绩差怎么办 初一数学考了3分怎么办 初二物理太差该怎么办 三年级孩子字写的差怎么办 小学三年级数学才考86怎么办 小孩子一发脾气就打妈妈怎么办 孩子做错事不肯道歉怎么办 小孩写作业注意力不集中怎么办 六年级的数学下册差怎么办 一年级小孩做作业慢怎么办 静不下心写作业怎么办