C. Element Extermination1400 / 思维 贪心 结论
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Element Extermination1400 / 思维 贪心 结论相关的知识,希望对你有一定的参考价值。
https://codeforces.com/problemset/problem/1375/C
详细题解
方法一:用栈来模拟,贪心的删除。
- 如果栈为空那么直接入栈
- 如果栈顶元素大于等于a[i],即不满足删除的条件,那么也直接入栈
- 满足条件了,贪心的删除
- 栈内此时只有一个元素,故直接跳过,不用入栈
- 栈内有多个元素,那么入栈分类的讨论。
- 取栈顶的两个元素,如果此时不满足删除条件了,那么直接重新入栈归位,退出循环
- 如果经过删除后的栈,栈内只剩一个了那么也退出。
- 取栈顶的两个元素,如果此时满足删除条件了,那么分类讨论
如果b左侧还有数,那么删b存a。a比b大,这样有更大的可能性比b前面的也大。
如果b左侧没元素,那么删除a.存b,这样b有尽可能的比a后面的数都小
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
int a[N],n;
int main(void)
{
int t; cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
stack<int>st;
for(int i=1;i<=n;i++)
{
if(st.size()==0) st.push(a[i]);
else if(a[i]<st.top()) st.push(a[i]);
else
{
if(st.size()==1) continue;
st.push(a[i]);
while(1)
{
auto a=st.top(); st.pop();
auto b=st.top(); st.pop();
if(a>b)
{
if(st.size()) st.push(a);
else st.push(b);
}
else
{
st.push(b),st.push(a);
break;
}
if(st.size()==1) break;
}
}
}
if(st.size()==1) puts("YES");
else puts("NO");
}
return 0;
}
结论: 你会发现最开始的一直没有删除,最后面的也一直存在
故只需看开头和结尾, 如果s1<sn 则YES 否则 NO
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*3+10;
int a[N],n;
int main(void)
{
int t; cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
if(a[1]<a[n]) puts("YES");
else puts("NO");
}
return 0;
}
以上是关于C. Element Extermination1400 / 思维 贪心 结论的主要内容,如果未能解决你的问题,请参考以下文章