日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

合并数字

發布時間:2025/4/16 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 合并数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

蒜頭君得到了?nn?個數,他想對這些數進行下面這樣的操作,選出最左邊的相鄰的差的絕對值為?11?的兩個數,只保留較小的數,刪去較大的數,直到沒有兩個相鄰的差的絕對值為?11?的數,問最多可以進行多少次這樣的操作?

輸入格式

輸入第一行為一個整數?n(1 \leq n \leq 10^5)n(1n105),表示數字的總數

第二行為?nn?個整數?x_1,x_2,...,x_n(0 \leq x_i \leq 10^9)x1?,x2?,...,xn?(0xi?109),表示這些數。

輸出格式

輸出一行,為一個整數,表示蒜頭君最多可以進行多少次這樣的操作。

樣例輸入

4 1 2 0 1

樣例輸出

3

自己寫的超時了,看了實驗室大神用的數組鏈表的思想,感覺,,太強了。

#include <bits/stdc++.h> using namespace std; int main() {int n;int a[100005],pre[100005],next[100005];cin>>n;for(int i=1;i<=n;++i)scanf("%d",&a[i]);for(int i=1;i<=n+1;++i){pre[i]=i-1;next[i]=i+1;}a[0]=a[n+1]=-2;int ans=0;for(int i=1;i<=n;){if(i==0)i=next[i];if(a[i]-a[pre[i]]==1){next[pre[i]]=next[i];pre[next[i]]=pre[i];i=pre[i];ans++;continue;}else if(a[i]-a[pre[i]]==-1){next[pre[pre[i]]]=i;pre[i]=pre[pre[i]];i=pre[i];ans++;continue;}i=next[i];}cout<<ans<<endl;return 0; }

看到學長的一個用棧來處理這道題目的方法,,,,orz~點擊打開鏈接

#include <iostream> #include <stack> using namespace std; int n,x; int ans=0; //最大操作次數 stack<int> st; int main() {int i;cin>>n;for(i=0;i<n;i++){cin>>x;//將x與當前棧頂元素st.top()比較,若棧不空且st.top()比x大1,則合并一次(此時即當前棧頂元素出棧)//然后x與次棧頂比較,以此類推,直到不滿足棧不空且st.top()比x大1 while(!st.empty() && st.top()-x==1){st.pop();ans++;}//若棧不空且x比st.top()大1,則合并一次//(此時即x"出棧",也就是忽略此x繼續看下一個輸入的x 但棧不發生任何變化) if(!st.empty() && x-st.top()==1)ans++;//其他情況(x為第一個元素或不滿足上述兩種情況):將x入棧elsest.push(x);}cout<<ans<<endl;return 0; }

總結

以上是生活随笔為你收集整理的合并数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。