poj 3618

题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=3618

注意没有距离原点等长的两点。

abs()用的极妙;

先前我的代码写了146行,自己都受不了了,而且提交还是错的,郁闷;

后来看了http://ren.javaeye.com/blog/344094  的代码:眼前一亮,没有我之前那么多繁杂的判断。

 

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{
	return abs(a) < abs(b);
}
int main()
{
	int nMark,i,k,tot,usedTime,mark[50001];
	long long time;
	while(scanf("%lld%d", &time, &nMark)!=EOF)
	{
		mark[0]=0;
		for(i=1; i<=nMark; i++)
			scanf("%d", &mark[i]);
		sort(mark+1,mark+nMark+1,cmp);
		tot = 0;
		usedTime = 0;
		k = 1;
		if(0 == mark[1])
		{
			tot = 1;
			k = 2;
		}
		for(; k<=nMark; k++)
		{
			if(abs(mark[k] - mark[k-1]) <= time - usedTime)
			{
				tot++;
				usedTime += abs(mark[k] - mark[k-1]);
			}
			else
				break;
		}
		printf("%d\n",tot);
	}
	return 0;
}

posted @ 2010-04-18 20:05  SubmarineX  阅读(398)  评论(0编辑  收藏  举报