/*
全部插入之后根据题目说明的规则进行排序,从大到小输出
小明很喜欢拍飞机,然后他希望在某一时间段里拍多架飞机。
每个样例第一行三个数分别表示可选的连续的quarter数、小明需要的前N位最优解、小明等待的quarter数的最小值,
第二行是表示每个可选的连续的quarter里面经过飞机的数目。
*/
/*
Run Time: 0.02secs
Run Memory: 1472KB
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct one{
int left;
int right;
int num;
double per;
int diff;
};
int quarterNum; //quarter总数量
int resultNum; //需要的结果数量
int minQuarter; //需要的最少quarter数量
int quarters[301]; //每个quarter的情况
vector<one> results;
//获取所有可能的结果
void getAll(){
for(int i=0; i<quarterNum-minQuarter+1; i++){
for(int j=i+minQuarter-1; j<quarterNum; j++){
one buf;
buf.left = i;
buf.right = j;
buf.num = 0;
for(int k=i; k<=j; k++)
buf.num += quarters[k];
buf.per = ((double)buf.num) / (double)(j-i+1);
buf.diff = j - i + 1;
results.push_back(buf);
}
}
}
//这次需要从大到小的排血
int cmp(one a, one b){
if(a.per != b.per){
return a.per > b.per; //飞机平均数量多者更大
}else{
if(a.diff != b.diff){
return a.diff > b.diff; //飞机数量相同时,quarter更长者更大
}else{
return a.right < b.right; //飞机数量和时间都相等,则更早结束的更大
}
}
}
int main()
{
int T;
cin >> T;
int TT = T;
while (T>0){
T--;
cin >> quarterNum >> resultNum >> minQuarter;
for(int i=0; i< quarterNum; i++)
cin >> quarters[i];
getAll(); //获取所有可能的结果
cout << "Result for run " << TT-T << ":" << endl;
if(results.size() != 0){
sort(results.begin(), results.end(), cmp); //对所有结果进行排序
for(int i=0; i<results.size()&&i<resultNum; i++){
cout << results[i].left+1 << "-" << results[i].right+1 << endl;
}
}
results.clear();
}
return 0;
}
Sicily 1046. Plane Spotting
最新推荐文章于 2014-12-15 17:08:41 发布
