Sicily 1046. Plane Spotting

来源:互联网 发布:c语言教程视频 编辑:程序博客网 时间:2024/04/29 21:56

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

310 5 51 5 0 2 1 4 2 5 0 2 10 3 510 3 1 4 2 6 3 0 8 0 5 5 51 2 3 4 5

Sample Output

Result for run 1:4-82-86-101-82-6Result for run 2:1-61-71-9Result for run 3:1-5


个人总结:statistic数组用来记录所有满足最短时长的period。为了减少运算,只有计算数组第一个,也就是例子中的 0~4 quarter 的时候需要循环,计算后面的1~5 或者 2~6 以及 0~5 都可以间接的利用 0~4 的数值来减少运算。最后为了避免Time Limit Exceeded,需要在比较函数中进行剪枝,也就是最后的order数组中,最多只有 5 (例子)个元素。比较前面 5 个如果不能插入,那么就不用继续往下比较了,这样可以避免不必要的运算


// Problem#: 1046// Submission#: 2934636// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/// All Copyright reserved by Informatic Lab of Sun Yat-sen University#include <iostream>#include <vector>#include <cmath>using namespace std;struct period {    int start;    int end;    int quarters;    period(int s, int e, int q):start(s), end(e), quarters(q) {};};void insertOrder (vector<period>& order, period p);int Compare(double d1, double d2);int expect;int main() {    int T, t = 0;    cin >>T;    while (t++ < T) {        vector<period> order;        int num, min;        cin >>num >>expect >>min;        int *planPerQuarter = new int[num];        for (int i = 0; i < num; i ++) {            cin >>planPerQuarter[i];        }        if (num - min + 1 <= 0) {            cout <<"error" <<endl;        }        int **statistic = new int*[num - min + 1];        for (int i = 0; i < num - min + 1; i ++) {            statistic[i] = new int[num - min - i + 1];            for (int j = 0; j < num - min - i + 1; j ++) {                if (j > 0) {                    statistic[i][j] = statistic[i][j-1] - planPerQuarter[j-1] + planPerQuarter[j+min+i-1];                } else if (i > 0) {                    statistic[i][j] = statistic[i-1][j] + planPerQuarter[j+min+i-1];                } else {                    int sum = 0;                    for (int k = j; k < j + min + i; k ++) {                        sum += planPerQuarter[k];                    }                    statistic[i][j] = sum;                }                insertOrder(order,  period(j, j+min+i-1, statistic[i][j]));            }        }        cout <<"Result for run " <<t <<":" <<endl;        for (int i = 0; i < expect && i < order.size(); i ++) {            cout <<order.at(i).start+1 <<"-" <<order.at(i).end+1 <<endl;        }    };    return 0;}void insertOrder (vector<period>& order, period p) {    for (size_t i = 0; i < order.size() && i < expect; i++) {        period item = order.at(i);        double per1 = 1.0 * p.quarters/(p.end - p.start + 1);        double per2 = 1.0 * item.quarters/(item.end - item.start + 1);        int result = Compare(per1, per2);        if ((result == 1)        || (result == 0 && p.end - p.start > item.end - item.start)        || (result == 0 && p.end - p.start == item.end - item.start && p.end < item.end))  {            order.insert(order.begin() + i, p);            return;        }    }    order.push_back(p);}int Compare(double ave1, double ave2)  {    if(fabs(ave1-ave2)<1e-6)        return 0;    if(ave1 > ave2)        return 1;    return -1;}              




0 0
原创粉丝点击