Sicily 1046. Plane Spotting
来源:互联网 发布:linux kvm web控制面板 编辑:程序博客网 时间:2024/05/17 02:08
/*全部插入之后根据题目说明的规则进行排序,从大到小输出 小明很喜欢拍飞机,然后他希望在某一时间段里拍多架飞机。每个样例第一行三个数分别表示可选的连续的quarter数、小明需要的前N位最优解、小明等待的quarter数的最小值,第二行是表示每个可选的连续的quarter里面经过飞机的数目。*//*Run Time: 0.02secsRun 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;}