sicily_1046 Plane Spotting

题目

Constraints

Time Limit: 1 secs, Memory Limit: 32 MB

Description

Craig is fond of planes. Making photographs of planes forms a major part of his daily life. Since he tries to stimulate his social life, and since it’s quite a drive from his home to the airport, Craig tries to be very efficient by investigating what the optimal times are for his plane spotting. Together with some friends he has collected statistics of the number of passing planes in consecutive periods of fifteen minutes (which for obvious reasons we shall call ‘quarters’). In order to plan his trips as efficiently as possible, he is interested in the average number of planes over a certain time period. This way he will get the best return for the time invested. Furthermore, in order to plan his trips with his other activities, he wants to have a list of possible time periods to choose from. These time periods must be ordered such that the most preferable time period is at the top, followed by the next preferable time period, etc. etc. The following rules define which is the order between time periods:

  1. A period has to consist of at least a certain number of quarters, since Craig will not drive three hours to be there for just one measly quarter.
  2. A period P1 is better than another period P2 if:
  • the number of planes per quarter in P1 is higher than in P2;
  • the numbers are equal but P1 is a longer period (more quarters);
  • the numbers are equal and they are equally long, but period P1 ends earlier.

Now Craig is not a clever programmer, so he needs someone who will write the good stuff: that means you. So, given input consisting of the number of planes per quarter and the requested number of periods, you will calculate the requested list of optimal periods. If not enough time periods exist which meet requirement 1, you should give only the allowed time periods.

Input

The input starts with a line containing the number of runs N. Next follows two lines for each run. The first line contains three numbers: the number of quarters (1–300), the number of requested best periods (1–100) and the minimum number of quarters Craig wants to spend spotting planes (1–300). The sec-nod line contains one number per quarter, describing for each quarter the observed number of planes. The airport can handle a maximum of 200 planes per quarter.

Output

The output contains the following results for every run:

  • A line containing the text “Result for run <N>:” where <N> is the index of the run.

  • One line for every requested period: “<F>-<L>” where <F> is first quarter and <L> is the last quarter of the period. The numbering of quarters starts at 1. The output must be ordered such that the most preferable period is at the top.

Sample Input

3
10 5 5
1 5 0 2 1 4 2 5 0 2
10 3 5
10 3 1 4 2 6 3 0 8 0
5 5 5
1 2 3 4 5

Sample Output

Result for run 1:
4-8
2-8
6-10
1-8
2-6
Result for run 2:
1-6
1-7
1-9
Result for run 3:
1-5

题目大意

Craig喜欢看飞机,但是没有太多业余时间,收集了一些航班的数据,请利用这些数据找出最符合Craig的时段(period),每个时期包含多个quarter,用首尾两个quarter的序号表示一段时期。

(对应代码中的标识符)
多组数据,数据组数runs
每组数据两行:
第一行:有多少个15分钟时段quarters(1-300) 要最优先的多少个时期requested(1-100) 每个时期最少要多长min(1-300)
第二行:每个quarter的航班数(0-200)

思路

  1. 利用结构体存储periods信息;
  2. 判断结构体两个periods的优先顺序:
    1. period每quarter的航班数不同,多的优先;
    2. 航班数相同,period持续时间长的优先;
    3. 以上两者均相同,早结束的优先;
  3. 选出最符合条件的requested个时期

代码

// Copyright (c) 2015 HuangJunjie@SYSU(SNO:13331087). All Rights Reserved.
// sicily_1046 plane_spotting: http://soj.sysu.edu.cn/1046
#define MAX_SIZE 300
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

struct Period {
  float average;
  int length;
  int end;
};

bool operator< (const Period &a, const Period &b) {
  if (fabs(a.average - b.average) > 1e-6) return a.average > b.average;
  if (a.length != b.length) return a.length > b.length;
  return a.end < b.end;
}

int main() {
  int runs;
  cin >> runs;
  int quarters, requested, min;
  int quars[MAX_SIZE + 1];   // abandons quars[0]
  Period periods[MAX_SIZE*MAX_SIZE];

  for (int run = 1; run <= runs; run++) {
    cin >> quarters >> requested >> min;
    for (int i = 1; i <= quarters; i++) {
      cin >> quars[i];
    }

    int count = 0;
    for (int i = 1; i <= quarters; i++) {
      int sum = 0;
      for (int j = i; j <= quarters; j++) {
        sum += quars[j];
        if (j - i + 1 >= min) {
          periods[count].length = j - i + 1;
          periods[count].end = j;
          periods[count].average = (double)sum / (j - i + 1);
          count++;
        }
      }
    }
    sort(periods, periods + count);

    cout << "Result for run " << run << ":" << endl;
    for (int i = 0;i < requested && i < count; i++) {
      cout << periods[i].end - periods[i].length + 1;
      cout << "-" << periods[i].end << endl;
    }
  }
  return 0;
}

参考

http://blog.csdn.net/qiuchenl/article/details/8253207

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容