UESTC 758 P酱的冒险旅途
来源:互联网 发布:数据结构和算法面试题 编辑:程序博客网 时间:2024/05/01 16:16
P酱的冒险旅途
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
P酱是个可爱的男孩子,有一天他在野外冒险,不知不觉中走入了一块神奇的地方。他在0 时刻进入这个地方,每一时刻他都只能向某一特定的方
向移动长度为1的距离,当然他也可以选择不移动。移动需要花费1 的时间。
各个时刻他允许移动的方向由一个字符串给出,字符串只包含U
、D
、L
、R
四种字符,其中U
表示向上(y 轴正方向)移动,D
表示向下(y 轴
负方向)移动,L
表示向左(x 轴负方向)移动,R
表示向右(x 轴正方向)移动。
字符串的第x 个字符代表了第x 时刻P酱可以移动的方向,字符串的长度只有t ,也就是说,超过t 时刻,P酱就要被邪恶的魔王大爷抓走了~
现在P酱在坐标原点,即(0,0) 点,而出口在(x,y) 点,P酱希望在规定的时间t 内尽快走到出口。帮助P酱在最短的时间内离开这里吧~
Input
第一行包含一个正数 T (T≤100 ),表示数据组数。
接下来每组数据包含两行,第一行包含三个整数 x,y,t (−105≤x,y≤105,0<t≤105 );第二行包含一个长度为t 的字符串,第i 个字符
表示在i 时刻他能移动的方向,字符串只包含U
,D
,L
,R
四种字母。
Output
对于每组数据输出一行,表示P酱到达出口的最早时刻。如果他无法在t 时刻内到达出口,输出-1
。
Sample input and output
Sample Input Sample Output 21 -1 5LDRDR-2 1 8RRUDDLRU
3-1
Hint
第一组样例:
- P酱在
0 时刻位于原点(0,0) ,他只能向左移动,但他选择不走。 - P酱在
1 时刻依然位于原点(0,0) ,他只能向下移动,于是他向下移动到了(0,−1) - P酱在
2 时刻位于(0,−1) ,他只能向右移动,于是他移动到了出口(1,−1) ,所以在3 时刻,P酱离开了这片区域!
My Solution
用数组的话,扫一次就够了;节约数组的话要扫好几次。我选择了用数组。觉得自己写的挺麻烦的。
#include <iostream>#include <cstdio>#include <string>#include <cstring>using namespace std;const int maxn=200000+8;int cot[26][maxn];//为了找最后一个最短的最后一个动作int main(){ int x,y,t,T,err=-1,ti; string str; scanf("%d",&T); while(T--){ memset(cot,0,sizeof(cot));//不能用memset初始化除0以外的值... ... 如果想赋值0, 那么你可以用一个for loop... 至于为什么不能赋值#, 请参考百度知道http://baike.baidu.com/view/982208.htm scanf("%d%d%d",&x,&y,&t); cin>>str; int len=str.length(); int l=0,r=0,u=0,d=0; for(int i=0;i<len;i++){ //第一个时间是1,所以要从1开始,但导致历遍的时候不好,所以加到下面去好了 switch(str[i]){ case 'L': {l++;cot['L'-'A'][l]=i+1;break;}//!注意每个地方都要用'X'-'A'转化过来 case 'R': {r++;cot['R'-'A'][r]=i+1;break;} case 'U': {u++;cot['U'-'A'][u]=i+1;break;} case 'D': {d++;cot['D'-'A'][d]=i+1;break;} //cot['d'-'a'][d]=i; default: break; } } if(x>=0&&y>=0){ if(x<=r&&y<=u) { ti=max(cot['R'-'A'][x],cot['U'-'A'][y]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); } else if(x>=0&&y<=0){ if(x<=r&&(-y)<=d) {ti=max(cot['R'-'A'][x],cot['D'-'A'][(-y)]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); } else if(x<=0&&y>=0){ if((-x)<=l&&y<=u) {ti=max(cot['L'-'A'][(-x)],cot['U'-'A'][y]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); } //等号全部放上去,不要紧的 else{ if((-x)<=l&&(-y)<=d) {ti=max(cot['L'-'A'][(-x)],cot['D'-'A'][-y]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); //!前面没有AC是这里掉了个 else } } return 0;}
谢谢
P酱的冒险旅途
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
P酱是个可爱的男孩子,有一天他在野外冒险,不知不觉中走入了一块神奇的地方。他在
向移动长度为1的距离,当然他也可以选择不移动。移动需要花费
各个时刻他允许移动的方向由一个字符串给出,字符串只包含U
、D
、L
、R
四种字符,其中U
表示向上(D
表示向下(
负方向)移动,L
表示向左(R
表示向右(
字符串的第
现在P酱在坐标原点,即
Input
第一行包含一个正数
接下来每组数据包含两行,第一行包含三个整数
表示在U
,D
,L
,R
四种字母。
Output
对于每组数据输出一行,表示P酱到达出口的最早时刻。如果他无法在-1
。
Sample input and output
21 -1 5LDRDR-2 1 8RRUDDLRU
3-1
Hint
第一组样例:
- P酱在
0 时刻位于原点(0,0) ,他只能向左移动,但他选择不走。 - P酱在
1 时刻依然位于原点(0,0) ,他只能向下移动,于是他向下移动到了(0,−1) - P酱在
2 时刻位于(0,−1) ,他只能向右移动,于是他移动到了出口(1,−1) ,所以在3 时刻,P酱离开了这片区域!
My Solution
用数组的话,扫一次就够了;节约数组的话要扫好几次。我选择了用数组。觉得自己写的挺麻烦的。
#include <iostream>#include <cstdio>#include <string>#include <cstring>using namespace std;const int maxn=200000+8;int cot[26][maxn];//为了找最后一个最短的最后一个动作int main(){ int x,y,t,T,err=-1,ti; string str; scanf("%d",&T); while(T--){ memset(cot,0,sizeof(cot));//不能用memset初始化除0以外的值... ... 如果想赋值0, 那么你可以用一个for loop... 至于为什么不能赋值#, 请参考百度知道http://baike.baidu.com/view/982208.htm scanf("%d%d%d",&x,&y,&t); cin>>str; int len=str.length(); int l=0,r=0,u=0,d=0; for(int i=0;i<len;i++){ //第一个时间是1,所以要从1开始,但导致历遍的时候不好,所以加到下面去好了 switch(str[i]){ case 'L': {l++;cot['L'-'A'][l]=i+1;break;}//!注意每个地方都要用'X'-'A'转化过来 case 'R': {r++;cot['R'-'A'][r]=i+1;break;} case 'U': {u++;cot['U'-'A'][u]=i+1;break;} case 'D': {d++;cot['D'-'A'][d]=i+1;break;} //cot['d'-'a'][d]=i; default: break; } } if(x>=0&&y>=0){ if(x<=r&&y<=u) { ti=max(cot['R'-'A'][x],cot['U'-'A'][y]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); } else if(x>=0&&y<=0){ if(x<=r&&(-y)<=d) {ti=max(cot['R'-'A'][x],cot['D'-'A'][(-y)]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); } else if(x<=0&&y>=0){ if((-x)<=l&&y<=u) {ti=max(cot['L'-'A'][(-x)],cot['U'-'A'][y]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); } //等号全部放上去,不要紧的 else{ if((-x)<=l&&(-y)<=d) {ti=max(cot['L'-'A'][(-x)],cot['D'-'A'][-y]);printf("%d\n",ti<=t? ti:err);} else printf("%d\n",err); //!前面没有AC是这里掉了个 else } } return 0;}
谢谢
0 0
- UESTC 758 P酱的冒险旅途
- UESTC 758 P酱的冒险旅途
- uestc--758--P酱的冒险旅途
- UESTC 758 P酱的冒险旅途
- UESTC 1899 P酱的冒险旅途
- uestc 1899 P酱的冒险旅途
- UESTC--758--P酱的冒险旅途(模拟)
- UESTC 758-P酱的冒险旅途【BFS】
- UESTC 758 P酱的冒险旅途【贪心】
- UESTC oj 758 P酱的冒险旅途
- UESTC 758:P酱的冒险旅途【水】
- UESTC P酱的冒险旅途 785 (规律模拟)
- cdoj_758_P酱的冒险旅途
- 人生最大的冒险就是不冒险
- 不去冒险,才是最大的冒险
- 旅途的意义
- 新的旅途
- 旅途的包袱
- JQuery中$.ajax()方法参数详解
- C++Primer第五版 12.1.2节练习
- 收藏的网站
- Java中用google-gson创建一个Java对象
- Android 笔记-Fragment 与 Activity之间传递数据
- UESTC 758 P酱的冒险旅途
- Kafka+Spark Streaming+Redis实时计算整合实践
- 导航栏
- UIImage简谈:[UIImage imageNamed:]与 [UIImage imageWithContentsOfFile]的区别
- 程序48: 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,
- 关于ViewGroup中requestDisallowInterceptTouchEvent的用法
- Linux互斥锁
- Android Rect和RectF的区别
- 对链表进行反序输出