A
给一个目标坐标,给出上下左右的运动路径,求在可以删除一部分路径的时候判断能否到达目标点。
题解思路
暴力出奇迹。
因为到达的点必须的步数使和路径没有关系的,所以我们记录上下左右的多少,然后比较到这点必须走的上下左右,有没有够就行了。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int main ()
{
int t;
cin>>t;
while(t--)
{
int px,py, u = 0 , d = 0 , l = 0 , r = 0 ;
cin>>px>>py;
string s;
cin>>s;
for (int i = 0 ; i < s.length() ; i++ )
{
if (s[i] == 'U')
u++;
else if ( s[i] == 'D' )
d++;
else if ( s[i] == 'R' )
r++;
else
l++;
}
//cout<<u<<" "<<d<<" "<<r<<" "<<l<<"\n";
if ( px >= 0 && py >= 0 )
{
if (u >= py && r >= px )
cout<<"YES\n";
else
cout<<"NO\n";
}else if ( px < 0 && py >= 0 )
{
if ( u >= py && -l <= px)
cout<<"YES\n";
else
cout<<"NO\n";
}else if ( px >= 0 && py < 0 )
{
if ( -d <= py && r >= px )
cout<<"YES\n";
else
cout<<"NO\n";
}else
{
if ( -d <= py && -l <= px )
cout<<"YES\n";
else
cout<<"NO\n";
}
}
return 0;
}
B
给你K个巨石,还有N座山,再给出每座山的高度。
巨石从一号山出发,当下一座山的高度小于等于这座山,巨石会不断向前,直到不满足要求,或者到达N山,到达N山就直接输出-1,如果到达不了,达到的最后一座山的高度加1.
判断第K个巨石能到达哪里。
题解思路
暴力枚举。
只要有巨石能到达N山,那么之后的必然能够到达。
然后就是枚举每个巨石到达的位置,我们对巨石的位置进行回溯,时间复杂度大概在O n级别,居然过了。
因为巨石卡在某一点的时候,可能让他堆满了,这样就有可能卡在前一个点了,每次回溯1即可,这样省下了枚举到达位置的时间复杂度。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int a[200];
int main ()
{
int t;
cin>>t;
while(t--)
{
int n,k , p = 1 ,book = 0;
cin>>n>>k;
for (int i = 1 ; i <= n ; i++ )
cin>>a[i];
while(k > 0 )
{
if ( p >= 2 )
p--;
while( p != n && a[p] >= a[p+1] )
{
p++;
}
if ( p == n )
{
book = 1;
break;
}
a[p]++;
k--;
}
if (book)
cout<<"-1\n";
else
cout<<p<<"\n";
}
return 0;
}