Sicily 1046为排序问题,根据题目所给出的三个条件对不同的Period进行比较排序,之后输出用户指定个数的periods;需特别注意只有一种period的情况。
1. 排序函数:
题目中的排序文字:
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.
对应代码:
bool cmp(Period p1, Period p2) {
if(p1.average != p2.average)
return p1.average > p2.average;
else if(p1.timeSperiod != p2.timeSperiod)
return p1.timeSperiod > p2.timeSperiod;
else
return p1.end < p2.end;
}
2. 数据结构
在本题中,我使用一个struct存储相关Period的信息,包括该Period的起始quarter编码及终止quarter编码、该段Period所包含的quarter数目,及每段quarter平均可见的飞机数量,对应代码:
struct Period {
double average;
int timeSperiod, start, end;
};
3. AC代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Period {
double average;
int timeSperiod, start, end;
};
bool cmp(Period p1, Period p2) {
if(p1.average != p2.average)
return p1.average > p2.average;
else if(p1.timeSperiod != p2.timeSperiod)
return p1.timeSperiod > p2.timeSperiod;
else
return p1.end < p2.end;
}
int main() {
int N, numQuarters = 0, requestPeriods = 0, minQuarters = 0;
cin >> N;
for(int i = 0; i < N; i++) {
int count = 0;
Period record[30000];
int quarters[301];
cin >> numQuarters >> requestPeriods >> minQuarters;
for(int j = 0; j < numQuarters; j++)
cin >> quarters[j];
int n = 0;
while(n + minQuarters - 1 < numQuarters) {
for(int k = minQuarters; k + n - 1 < numQuarters; k++) {
int sum = 0;
for(int m = n; m < k + n; m++) {
sum += quarters[m];
}
record[count].average = (sum * 1.0) / k;
record[count].start = n + 1;
record[count].end = n + k;
record[count].timeSperiod = k;
count++;
}
n++;
}
if(count == 1) {
cout << "Result for run " << i + 1 << ":" << endl;
cout << 1 << "-" << numQuarters << endl;
} else {
sort(record, record + count, cmp);
cout << "Result for run " << i + 1 << ":" << endl;
for(int i = 0; i < requestPeriods; i++) {
cout << record[i].start << "-" << record[i].end << endl;
}
}
}
return 0;
}