这题就是确定一个点,然后去找能够实现最短距离的点且距离最远的点,因为题目要求点最少。在查找时,如果从最后的点开始枚举,找到的第一个满足距离最短的点一定是最远点,但是查找的复杂度是O(n),共有n次查找,O(n^2)的复杂度题目数据无法承受,因此可以考虑二分查找,以起点的下一个点直到最后一个点的区间作为查找对象,每次选取中点作为更新区间的上限和下限的标准,如果中点到起点是最短距离就更新下限为中点,否则上限是中点,推出的时候处理一下就行。之所以能够这样更新区间是因为,如果有一个点不能满足最短距离,那么在它后面的点也无法满足最短距离。

AC代码:

#include<cstdio>
const int maxn=2e5+5;
char s[maxn];
struct node{
	int x,y;
	node(){}
	node(int x,int y):x(x),y(y){
	}
}p[maxn];
int abs(int a){
	return a<0?(-a):a;
}
int bound(int x,int y){
	int z=x-1;
	while(x<y){
		int k=(x+y)/2;
		int d=abs(p[k].x-p[z].x)+abs(p[k].y-p[z].y);
		int h=k-z;
		if(d==h) x=k;
		else if(d<h) y=k;
		if(x==y-1) break;
	}
	return x;
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		scanf("%s",s);
		int x=0,y=0;
		p[0]=node(0,0);
		for(int i=1;i<=n;++i){
			if(s[i-1]=='R') ++y;
			else if(s[i-1]=='L') --y;
			else if(s[i-1]=='U') --x;
			else ++x;
			p[i]=node(x,y);
		}
		int ans=0;
		for(int i=0;i<n;){
		//利用二分查找实现快速查找  否则会超时
			i=bound(i+1,n+1);
			++ans;
		}
		printf("%d\n",ans);
	}
	return 0;
}

如有不当之处欢迎指出!



最新文章

  1. mac开机密码忘记了, 新建用户方法
  2. CSharpGL(40)一种极其简单的半透明渲染方法
  3. redis shell命令大全
  4. 【BZOJ】【1044】【HAOI2008】木棍分割
  5. SurfaceView 和 TextureView
  6. yii2 ActiveRecord常用用法
  7. [转] 如何让CloudStack使用KVM创建Windows实例成功识别并挂载数据盘
  8. 【排序算法】归并排序算法 Java实现
  9. SpringMvc 关于 EXCEL
  10. [Codeforces]848C - Goodbye Souvenir
  11. .babelrc配置(webpack)
  12. cocos 游戏开发 (第一天作业)
  13. Spring @Scheduled定时任务的fixedRate,fixedDelay,cron执行差异
  14. C++ 中的导致编译错误汇总
  15. 11,EasyNetQ-调度事件与定时发布
  16. ucenter
  17. 白鹭引擎 - 资源文件的加载 ( RES, loadConfig, loadGroup )
  18. 深入 Java 调试体系: 第 1 部分,初探JPDA 体系
  19. MySQL学习笔记:coalesce
  20. URAL 1203 Scientific Conference(贪心 || DP)

热门文章

  1. 如何通过命令或脚本方式在Windows上访问linux系统
  2. 流API--流的收集
  3. 【Spring实战】--1Spring的核心
  4. 在Tomcat中配置连接池和数据源
  5. linux(centos)下安装git并上传代码
  6. scala 小结(一)
  7. 13 Basic Cat Command Examples in Linux(转) Linux中cat命令的13中基本用法
  8. 以C语言为例的程序性能优化 --《深入理解计算机系统》第五章读书笔记
  9. 使用open-falcon监控Nginx
  10. 使Tomcat指向指定的JDK目录