问题 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()到i
        		s.pop();///出栈
        	}
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值