题目意思:
小明很喜欢拍飞机,然后他希望在某一时间段里拍多架飞机。每个样例第一行三个数分别表示可选的连续的quarter数、小明需要的前N位最优解、小明等待的quarter数的最小值,第二行是表示每个可选的连续的quarter里面经过飞机的数目。
解题思路:
仔细按照题目要求,逐个判断,AC不难。。。
代码:
#include <iostream>
#include <list>
using namespace std;
// 记录时间段信息的
struct pps{
int numbers;
int begin;
int end;
};
int plane[ 302 ];
list< pps > lps;
// 比较两个时间段的优劣
bool larger( pps l, pps s )
{
double lrate = l.numbers * ( s.end - s.begin + 1 );
double srate = s.numbers * ( l.end - l.begin + 1 );
if( lrate > srate )
return true;
if( lrate < srate )
return false;
int lperiod = l.end - l.begin;
int speriod = s.end - s.begin;
if( lperiod > speriod )
return true;
if( lperiod < speriod )
return false;
if( l.end < s.end )
return true;
return false;
}
// 有序插入时间段列表中
void insertByOrder( pps container, int period )
{
list< pps >::iterator pit;
pit = lps.begin();
int times = 0;
while( pit != lps.end() && times < period )
{
if( larger( container, *pit ) )
{
pit = lps.insert( pit, container );
break;
}
pit++;
times++;
}
if( pit == lps.end() && times < period )
pit = lps.insert( pit, container );
}
int main()
{
int size;
cin >> size;
int times = 0;
while( times < size )
{
times++;
int fre, period, min;
cin >> fre >> period >> min;
// 输入每15分钟的飞机数
int sum, add;
sum = 0;
plane[ 0 ] = 0;
for( int i = 0; i < fre; i++ )
{
cin >> add;
sum += add;
plane[ i + 1 ] = sum;
}
// 统计可能的区间,并插入排序
lps.clear();
pps container;
for( int i = 1; i <= fre; i++ )
{
for( int j = i + min - 1; j <= fre; j++ )
{
container.begin = i;
container.end = j;
container.numbers = plane[ j ] - plane[ i - 1 ];
insertByOrder( container, period );
}
}
// 输出结果
cout << "Result for run " << times << ":" << endl;
list< pps >::iterator lit;
lit = lps.begin();
int pes = 0;
while( lit != lps.end() && pes < period ){
cout << lit->begin << "-" << lit->end << endl;
lit++;
pes++;
}
}
return 0;
}
这题目应该是有点水的,但拿来练习也是不错滴。