本文主要是介绍问题 N: 扶桑号战列舰,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目
const int maxn=1e5+5;
int a[maxn]={0};
stack<int>s;
int main()
{int n;cin>>n;long long ans=0;for(int i=1;i<=n;i++) {scanf("%d",&a[i]);if(a[i]>a[i-1])///后一个比前一个大,说明若第i-1个已经建好了(顺便把第i个建到a[i-1]层),还需要建a[i]-a[i-1]次才能建好第i个ans=ans+a[i]-a[i-1];///更新答案}cout<<ans<<endl;for(int i=1;i<=n;i++){if(a[i]>a[i-1]) ///说明递增,则入栈for(int j=a[i];j>a[i-1];j--) s.push(i);///先入栈的序号所对的a[i]小,所以建的次数少(后出栈)if(a[i]>a[i+1]) ///a[i]>a[i+1],说明不单调递增了,把单调的输出for(int j=a[i];j>a[i+1]&&!s.empty();j--) ///建a[i]-a[i+1]次,那么第i个剩余的需要建立的层数就和第i+1个一样了{ printf("%d %d\n",s.top(),i); ///建立栈顶所对下标s.top()到is.pop();///出栈}}
}
这篇关于问题 N: 扶桑号战列舰的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!