简单题。。。 但要注意理解题意,每次都从都选离原点最近的未访问过的点走。。
思路: 将-100,000 ≤ xi ≤ 100,000范围 转换成 0 ~ 200,000 OFFSET(偏移量) 100000 ,由于我是用bool visit[N]。。。虽然代码有点长。。但跑出来的效率比较高。。
//376K 63MS
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <climits>
#define MIN(X,Y) ((X)<(Y)?(X):(Y))
#define MAX(X,Y) ((X)>(Y)?(X):(Y))
#define N 200005
#define OFFSET 100000 //作为偏移量
using namespace std ;
bool visit[N] ;
void Exploration ( const double t )
{
double count_time ;
count_time = 0 ;
int ans ; //记录参观的景点数
ans = 0 ;
int index ;
index = OFFSET ;
while ( count_time <= t )
{
int mark1 , mark2 ; //每次从100000向左,右搜索第一个未遍历过的点
int i , k ;
for ( i = OFFSET , k = OFFSET ; i < N || k >= 0 ; i ++ , k -- )
{
if ( visit[i] )
{
mark1 = i ;
break ;
}
if ( visit[k] )
{
mark2 = k ;
break ;
}
}
double dis1 , dis2 ;
dis1 = fabs ( (double)OFFSET - (double)mark1 ) ;
dis2 = fabs ( (double)OFFSET - (double)mark2 ) ;
int min ;
if ( dis1 < dis2 )
{
min = mark1 ;
}
else
{
min = mark2 ;
}
if ( count_time + fabs( (double)min - index ) > t )
{
break ;
}
ans ++ ;
count_time += fabs ( (double)min - index ) ; //记录时间
index = min ; //新参观的landmark
visit[index] = false ;
mark1 = mark2 = INT_MAX ; //注意重置
}
printf ("%d\n" , ans ) ;
}
int
main ( )
{
double t ;
int n ;
while ( EOF != scanf ("%lf%d" , & t , & n ) )
{
memset ( visit , 0 , sizeof ( visit ) ) ;
for ( int i = 1 ; i <= n ; i ++ )
{
int index ;
scanf ("%d" , & index ) ;
index += OFFSET ;
visit[index] = true ;
}
Exploration ( t ) ;
}
return 0 ;
}