sicily 1046. Plane Spotting 排序 结构
2014-01-04 21:45
281 查看
这道题不用结构体或类的话做起来挺累的。而且做完这道题才发现我C和C++很多语法和函数都忘了。像sort(p, p+cnt)这样的排序函数都不会用了,差点就自己写冒泡排序了。而符号重写就完全忘了,毕竟很少有语言会有这种功能开放了。
其中新写的代码用了师兄的结构体和比较符号“<”的重写。
先贴以前写的代码:
本文出自 “玄月天下” 博客,请务必保留此出处http://xuewei.blog.51cto.com/6061915/1348529
其中新写的代码用了师兄的结构体和比较符号“<”的重写。
先贴以前写的代码:
#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
相关文章推荐
- 数据结构实验之排序二:交换排序
- 20150920结构体 定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出;
- 数据结构与算法——计数排序、桶排序、基数排序
- 夕拾-数据结构-快速排序
- Sicily 1021 Couples(数据结构——栈)
- C++堆(数据结构堆也就是树状结构)排序
- 数据结构与算法——字符串排序
- 数据结构思维 第十七章 排序
- 数据结构实验:查找和排序
- 数据结构算法之快速排序
- 数据结构实验之排序一:一趟快排
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序六:希尔排序
- [数据结构]快速排序
- Java实现简单数据结构之二叉树结构排序 binary tree
- 数据结构基础(4) --快速排序
- 数字之和排序,数据结构
- 数据结构书中基于整数的简单排序Java实现,巩固一下基础
- C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)
- SDUT 3398 数据结构实验之排序一:一趟快排