写这道题用了单调队列,当然还有别的做法。
题目大意:N个人喊号,从A喊到A+N-1,其中肯定有一个人喊错了,让你找出这个人。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4727。
大体思路:维护一个单调的数栈,如果后一个数比前一个数大一,则弹出栈里的数,并把新的数压栈,否则当前数就是错的,记录该值。这里有个需要注意的点,就是如果所有人都喊对了,那么错的就是第一个人。
以下是ac代码:
#include<iostream>
#include<stack>
using namespace std;
int main(){
int t;
scanf("%d",&t);
int Case=0;
while(t--){
stack<int> s;
int n;
scanf("%d",&n);
int k=1;
bool flag=true;
for(int i=1;i<=n;i++){
int id;
scanf("%d",&id);
if(s.empty())
s.push(id);
else if((s.top()+1)==id){
s.pop();
s.push(id);
}
else if(flag&&(s.top()+1!=id)){
flag=false;
k=i;
}
}
printf("Case #%d: %d\n",++Case,k);
}
return 0;
}