Codeforces Round #699 (Div. 2) A和B题
本场链接:Codeforces Round #699 (Div. 2)
A - Space Navigation
题目大意:
有一个飞船一开始在(0,0),有一个操作列表s,每个位置表示一个上下左右的移动操作.有一个目的地坐标是(px,py).但是这个操作序列不一定能够正确的走到目的地,现在问是否能通过删去某些操作的方式使得飞船能走到目的地.只需输出是否.
思路:
给出一个坐标(x,y),如果给出的字符串s包含坐标转化成的字符串,那么就可以到达终点:否则不可以到达。
这里比较两个字符串成为关键。但是比较字符串不如比较数组简洁。
所以在输入字符串的时候,统计每种操作的个数。然后看应该比较的操作中输入的个数是否多于它应该的个数。
这里我的想法太直接了,所以写出来的代码太繁琐,不够聪明。
有个2000多分的大佬写出来的不错,我引用一下:puts(-l<=x&&x<=r&&-d<=y&&y<=u?"YES":"NO");
整体代码如下:
#include<stdio.h> #define ll long long int main() { ll t,x,y;ll us=0,rs=0,ls=0,ds=0;ll u=0,d=0,l=0,r=0; int flag=0; scanf("%lld",&t); char str[100010]; while(t--) { x=0;y=0;u=0;r=0;d=0;l=0;flag=0; scanf("%lld%lld",&x,&y); scanf("%s",str); for(int i=0;str[i]!='\0';i++) { if(str[i]=='U') u++; else if(str[i]=='R') r++; else if(str[i]=='D') d++; else if(str[i]=='L') l++; } puts(-l<=x&&x<=r&&-d<=y&&y<=u?"YES":"NO"); } return 0; }
B - New Colony
题目大意:
有n个山,每个山有高度hi.人站在第一个山头上丢牛逼土,牛逼土有自动检查当前高度的牛逼功能,具体来说:
- 如果当前的位置是ii,那么如果hi≥hi+1那么牛逼土会直接飞到下一个山头.
- 反之牛逼土会觉得当前这个山头不够牛逼,并且牺牲自己让当前的山头高度增加一,即hi+=1.
- 特殊情况:牛逼土可能会飞出n个山头之外.
一共有k个牛逼土,每次都在1这个位置丢。
思路:
直接暴力,因为数据范围太大而且规律难总结。
代码如下:
#include<stdio.h> int n;long long k,i,j; int a[105]; int main() { int t; scanf("%d",&t); while(t--){ int count=0; scanf("%d%lld",&n,&k); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=k;i++) { count=0; for(j=1;j<n;j++) if(a[j]<a[j+1]) {a[j]++,count++;break;} if(!count) break; } if(i-k-1) printf("-1\n"); else printf("%lld\n",j); } return 0; }
第一次发补的题到博客上,哈哈,瞎玩吧。