Codeforces Round #699 (Div. 2) AB

71 篇文章 1 订阅
46 篇文章 2 订阅

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值