您的位置:首页 > 其它

sicily 1046. Plane Spotting 排序 结构

2014-01-04 21:45 281 查看
这道题不用结构体或类的话做起来挺累的。而且做完这道题才发现我C和C++很多语法和函数都忘了。像sort(p, p+cnt)这样的排序函数都不会用了,差点就自己写冒泡排序了。而符号重写就完全忘了,毕竟很少有语言会有这种功能开放了。
其中新写的代码用了师兄的结构体和比较符号“<”的重写。
先贴以前写的代码:
#include <iostream>
#include <vector>
using namespace std;
class PeriodNode{
int st;
int end;
double per;
public:
PeriodNode( int s, int e, double p) {
st = s;
end = e;
per = p;
}
int  getSt() {
return st;
}
int getEnd() {
return end;
}
double getPer() {
return per;
}
};
int main() {
int N;
int fst[3];
double snd[300];
double sum;
double per;
int i, j, k;
vector<PeriodNode> period;
vector<PeriodNode>::iterator iter;
cin >> N;
for( i = 0; i < N; ++i ) {
period.clear();
for( j = 0; j < 3; ++j)
cin >> fst[j];
for( j = 0; j < fst[0]; ++j )
cin >> snd[j];
for( j = 0; j < fst[0] - fst[2] + 1; ++j )
{
sum = 0;
for( k = j; k < j + fst[2]; ++k ) {
sum += snd[k];
}
per = sum / fst[2];
--k;
for(iter = period.begin(); iter != period.end(); ++iter)
{
if( per > (*iter).getPer() )
{
period.insert( iter, PeriodNode(j, k, per) );
break;
}
else if ( per == (*iter).getPer() && (k-j) > ((*iter).getEnd()-(*iter).getSt()) )
{
period.insert( iter, PeriodNode(j, k, per) );
break;
}
else if ( per == (*iter).getPer() && (k-j) == ((*iter).getEnd()-(*iter).getSt()) && k < (*iter).getEnd() )
{
period.insert( iter, PeriodNode(j, k, per) );
break;
}
}
if( iter == period.end() )
period.push_back(PeriodNode(j, k, per));
for( k = j + fst[2]; k < fst[0]; ++k ) {
sum += snd[k];
per = sum / (k - j + 1);
for(iter = period.begin(); iter != period.end(); ++iter)
{
if( per > (*iter).getPer() )
{
period.insert( iter, PeriodNode(j, k, per) );
break;
}
else if ( per == (*iter).getPer() && (k-j) > ((*iter).getEnd()-(*iter).getSt()) )
{
period.insert( iter, PeriodNode(j, k, per) );
break;
}
else if ( per == (*iter).getPer() && (k-j) == ((*iter).getEnd()-(*iter).getSt()) && k > (*iter).getEnd() )
{
period.insert( iter, PeriodNode(j, k, per) );
break;
}
}
if( iter == period.end() )
period.push_back(PeriodNode(j, k, per));
}
}
cout << "Result for run " << i+1 << ":" << endl;
for( j = 0;  j < fst[1] && j < period.size(); ++j ) {
cout << period[j].getSt()+1 << '-' << period[j].getEnd()+1 << endl;
}
}
return 0;
}
再贴新写的代码:
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
struct period {
double aver;
int length,ends;
};
bool operator <(const period &a,const period &b){
if (fabs(a.aver-b.aver)>1e-6) return a.aver>b.aver;
if (a.length!=b.length) return a.length>b.length;
return a.ends<b.ends;
}
int main() {
int N, nq, nb, nm;
int i, j, k;
int temp;
int q[300];
period p[90000];
int cnt;
cin >> N;
for( i = 0; i < N; i++ ) {
cin >> nq >> nb >> nm;
for ( j = 0; j< nq; j++ ){
cin >> q[j];
}
cnt = 0;
for ( j = 0; j < nq; j++ ) {
temp = q[j];
for ( k = j + 1; k < nq; k++ ) {
temp += q[k];
if( k - j + 1 >= nm ) {
p[cnt].length = k - j +1;
p[cnt].ends = k + 1; // 记得加1,因为输出的不是数组下标,而是实际从1开始的下标
p[cnt].aver = (double)temp / (k-j+1);
cnt++;
}
}
}
sort(p, p+cnt);
cout << "Result for run " << i +1 << ":" << endl;
for( j = 0; j < nb && j < cnt; j++) {
cout << p[j].ends - p[j].length + 1 << "-" << p[j].ends<< endl;     }
}
return 0;
}


本文出自 “玄月天下” 博客,请务必保留此出处http://xuewei.blog.51cto.com/6061915/1348529
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: