CodeForces-748C
来源:互联网 发布:网络与信息安全承诺书 编辑:程序博客网 时间:2024/06/08 00:22
这题就是确定一个点,然后去找能够实现最短距离的点且距离最远的点,因为题目要求点最少。在查找时,如果从最后的点开始枚举,找到的第一个满足距离最短的点一定是最远点,但是查找的复杂度是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;}如有不当之处欢迎指出!
0 0
- CodeForces-748C
- 748 C. Santa Claus and Robot codeforces
- Codeforces-340-C(c++)
- Codeforces-507-C(c++)
- CodeForces 731C C
- CodeForces-612C C
- CODEFORCES 265C CODEFORCES, 265C
- codeforces #78 div2 C
- Codeforces 117C Cycle
- CodeForces 209C
- CodeForces 156C Cipher
- codeforces 148 div2 C
- codeforces 242C
- Codeforces-234C Weather
- codeforces 106C Buns
- codeforces 158C
- Codeforces 243C
- CodeForces 13C Sequence
- My first Python script
- ETL解决方案之ETL子系统详解
- Penguins DbTools数据库管理移植差分工具(EXCEL相关)
- Java压缩技术(一) ZLib
- 第二天
- CodeForces-748C
- 开发工程师人生之路
- 取得设备运行时间
- Java压缩技术(二) ZIP压缩——Java原生实现
- Java中的24种设计模式与7大原则
- 算法3:动态规划(一)——简单动规
- CSS3 box-shadow 属性
- 关于MongoDB安全事件的一些思考
- Scala里面如何使用break和continue