2020年牛客算法入門課練習賽1 C丟手絹(雙指針)

題目傳送門

“丟丟手絹,輕輕地放在小朋友的後面,大家不要告訴她,快點快點抓住她,快點快點抓住她。”
牛客幼兒園的小朋友們圍成了一個圓圈準備玩丟手絹的遊戲,但是小朋友們太小了,不能圍成一個均勻的圓圈,即每個小朋友的間隔可能會不一致。爲了大家能夠愉快的玩耍,我們需要知道離得最遠的兩個小朋友離得有多遠(如果太遠的話牛老師就要來幫忙調整隊形啦!)。
因爲是玩丟手絹,所以小朋友只能沿着圓圈外圍跑,所以我們定義兩個小朋友的距離爲沿着圓圈順時針走或者逆時針走的最近距離。

輸入描述:
第一行一個整數N,表示有N個小朋友玩丟手絹的遊戲。
接下來的第2到第n行,第i行有一個整數,表示第i-1個小朋友順時針到第i個小朋友的距離。
最後一行是第N個小朋友順時針到第一個小朋友的距離。
輸出描述:
輸出一個整數,爲離得最遠的兩個小朋友的距離。
示例1
輸入

3
1
2
3
3

輸出

3

首先吐槽一下,不知道最後一行這個數給的有什麼用處,貌似不用輸入這個數也能過。

這就是一道雙指針的簡單應用,定義一個左右指針,每次掃描到最遠處,什麼是最遠處呢,由於這是一個環,所有正着數剛好大於逆着數的極限位置的時候,這個時候就是遠的位置,然後正着數大於逆着數的距離的時候,左邊指針向前移,否則的話右邊指針向後移,一直維護一個最大值即可。

AC代碼

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
const int inf=0x3f3f3f3f;
typedef long long ll;
inline int read(){
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = (x<<1) + (x<<3) + (ch^48);
        ch = getchar();
    }
    return x * f;
}
int a[maxn],sum;
int main()
{
      int n;
      cin>>n;
      for(int i=1;i<=n;i++)
      {
          cin>>a[i];
          sum+=a[i];
      }
      for(int i=1;i<=n;i++)
      a[i+n]=a[i];
      int left,res=0,ans=-1,l=1,r=1;
      while(l<=n)
      {
          res+=a[r++];
          left=sum-res;
          while(left<res)
          {
              res-=a[l++];
              ans=max(ans,left);
              left=sum-res;
          }
          ans=max(ans,res);
      }
      cout<<ans<<endl;
      system("pause");
      return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章