Great Vova Wall (Version 1/2) CodeForces - 1092D1/D2(思维+栈)

versin1 ——题目链接

题意:给定一个数列,你可以选择让某个元素+2,或者让相等的两个相邻元素一起+1,问最终能否使得n个元素相等。输出YES / NO
(1<=n<=2e5)

思路:输出YES / NO 的题大胆猜思路就好。 对于第i个元素,如果第i+1号元素和它相加为偶数,也就是奇偶性相同,那么a[i] a[i+1]可以变成任意一个不小于他们中最大值的元素,类似于()这种括号匹配 。

所以我们用栈来记录。模拟这个匹配过程,最终栈内元素最多只能有1个,也就是其他的匹配对可以任意变大 ,栈内剩余元素也+2,最终相等。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int n;
stack<int> s;
//如果i 和i+1的元素相差为偶数,那么i i+1可以变成任意一个大于等于自己的元素,所以可以不管它
//最终栈里面只能剩下一个元素
int main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);
    scanf("%d",&n);
    for(int i = 1; i <= n ; i++) 
    {
        int t;
        scanf("%d",&t);
        if(s.size() && (s.top() + t) % 2 == 0) s.pop();
        else s.push(t);
    }
    if(s.size()<=1) puts("YES");
    else puts("NO");
    return 0;
}

version2——题目链接

题意:给定一个数列,你可以选择让相等的两个相邻元素一起+1,问最终能否使得n个元素相等。输出YES / NO
(1<=n<=2e5)

思路:这题和上题相比少了让某个元素+2这个条件,其实思路差不多,也是用栈
匹配的条件由奇偶性相同变成二者大小相等,更苛刻一些。

而且有2种情形一定是NO的,
第一是栈内存在i使得,a[i] <a[i+1] ,因为a[i]没有与之匹配的,所以不能变大。
第二种是如果最终栈内剩余元素为1,并且这个剩余的元素小于最大值,它也无法变大。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int n;
stack<int> s;
//i和i+1号元素相等 就可以出栈
int main()
{
//    ios::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);
    scanf("%d",&n);
    int mmax=-1;
    int flag=1;
    for(int i = 1; i <= n ; i++) 
    {
        int t;
        scanf("%d",&t);
        if(s.size())
        {
            if(s.top()<t) flag=0;//一定不行的情况
            else if(s.top()==t) s.pop();//匹配成功
            else s.push(t);
        }
        else s.push(t);
        mmax=max(mmax,t);//记录最大值
    }
    if(s.size()>1  || (s.size()==1 && s.top()<mmax)) flag=0;
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值