问题 A: 阿Q的记忆

问题 A: 阿Q的记忆

时间限制: 1 Sec 内存限制: 128 MB

题目描述
阿Q登山回来,觉得山都长得一个样子。她记得某一段:她往下走了1米,再往下走了1米,然后往上走了1米,然后balabalabala……用一个包含U和D的字符串表示。U表示向上1米,D表示向下1米。她还记得全程起点的高度,终点的高度,以及她一共走了多少时间(一个单位时间内,她会使自己海拔升高或降低1米)。她知道山的任意位置的海拔都是非负的。她想知道,自己的记忆有没有自相矛盾。
输入
多组测试数据,对于每组测试数据:第一行,三个整数n,S,T,表示走的次数,起点、终点海拔;第二行,由U和D构成字符串,表示中间某一段的情况;
输出
对于每组测试数据,如果自相矛盾,输出NO,否则输出YES。
样例输入 Copy
4 0 4
UU
4 0 4
D
样例输出 Copy
YES
NO
提示
对于100%的数据n,S,T<=100000 字符串长度<=50
题意: 可以走 n n n步,起点是 s s s ,终点 t t t,给出你走的中间一段走的方式位置大于等于零 问你是否能满足条件
思路: 你先按这他给的走,如果位置小于零时,你走多走一步让你先上来,之后再走,判断步数与总步数大小,

  1. 不够肯定就不能满足条件
  2. 正好够用,就判断当前能到的位置是不是终点位置,能到可以,不能到则不满足条件
  3. 步数小于总步数,算出你走完这些步数还剩多少步可以走(还可以走的),再算出从你最后到的与终点的距离(应该走的)。然后还可以走的如果小于应该走的肯定就不行,大于则需要多出的是否是偶数,就是消耗这些多的步数。
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#include <immintrin.h>
#pragma GCC optimize(2)
#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<ll,ll> pii;
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn=1e5+1010;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=1e9+7;
const int MOD=10007;
 
inline int read() {
    int x=0;
    bool t=false;
    char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=true,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return t?-x:x;
}
ll n,m,p;
string str;
int main() {
    while(~scanf("%lld%lld%lld",&n,&m,&p)) {
        cin>>str;
        ll len=str.size();
        ll sum=len;
        for(int i=0;i<len;i++){
            if(str[i]=='U') m++;
            else m--;
            if(m<0) m++,sum++;///多用一次
        }
        if(sum>n){
            cout<<"NO"<<endl;
        }else if(sum==n){
            if(m==p) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }else {
            ll ans1=n-sum;///还有
            ll ans2=abs(p-m);///需要
            ll ans=ans1-ans2;
            if(ans<0) cout<<"NO"<<endl;
            else {
                if(ans%2) cout<<"NO"<<endl;
                else cout<<"YES"<<endl;
            }
        }
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值