熊大媽的乃修在時針的帶領下,圍成了乙個圓圈舞蹈,由於沒有嚴格的教育,奶牛們之間的間隔不一致。
奶牛想知道兩隻最遠的奶牛到底隔了多遠。奶牛a到b的距離為a順時針走和逆時針走,到達b的較短路程。告訴你相鄰兩個奶牛件的距離,請你告訴奶牛兩隻最遠的奶牛到底隔了多遠。
輸入格式:
第一行乙個整數n,表示有n只奶牛。(2<=n<=100000)
接下2-n+1行,第i行有乙個數,表示第i-1頭奶牛順時針到第i頭奶牛的距離。(1<=距離<=maxlingint,距離和<=maxlongint)
第n+1行的數表示第n頭奶牛順時針到第1頭奶牛的距離。
輸出格式:
一行,表示最大距離。
輸入樣例#1:
crile.in512345
輸出樣例#1:
crile.out7solution
做法1:
記錄字首和,可知字首和是遞增的,列舉起點,我們不難二分乙個"中點"
中點左邊的點距離小於半個周長,右邊的點距離大於半個周長,然後用終點順、逆時針距離最小值更新答案即可。
複雜度o(nlogn)
做法2:
記錄字首和sum,總長度len
於是從第一頭奶牛開始,找到l,r兩隻牛,l <= r 這裡從1開始
不難發現當距離小於總長度一半的時候,我們需要去找l, r + 1
當距離大於總長度一半的時候,我們需要去找l + 1, r 一定優於l + 1, r + 1
這樣省去了很多無用的l,r亂搞一下就可以了
複雜度o(n)
code
第二種做法
#include const int maxn = 100000 + 10;inline void read(int &x)
inline void swap(int &a, int &b)
inline int min(int a,int b)
inline int max(int a,int b)
int n;
int sum[maxn],num[maxn],len;
int ans;
int main()
read(num[1]);len += num[1];sum[n + 1] = sum[n] + num[1];
int l = 1, r = 1;int mid = len >> 1;
while(l <= n + 1 && r <= n + 1)
else if(sum[r] - sum[l] <= mid)
else if(sum[r] - sum[l] > mid)
}printf("%d", ans);
return 0;
}
第一種做法
#include const int maxn = 300000 + 10;inline void read(int &x)
inline void swap(int &a, int &b)
inline int min(int a,int b)
inline int max(int a,int b)
int n;
int sum[maxn >> 1],len;
int ans;
inline int erfen(int l, int r, int p)
return l;
}//列舉起始點i,二分找j,令s[j] - s[i] <= s / 2 這樣j 和 j-1 兩個點二選一
//處理環就多複製一層
int main()
for(int i = 1;i <= n;i ++)
for(int i = 1;i <= 2 * n;i ++)
printf("%d", ans);
return 0;
}
洛谷P5174 圓點
題目大意 給你 r r leqslant10 求 sum limits sum limits x 2 y 2 leqslant r x 2 y 2 題解 明顯可以發現這是對稱的,所以可以只列舉四分之一,並且 x,y leqslant sqrt r 所以式子成了 4 sum limits sum li...
洛谷P3254 圓桌問題
題目大意 有 m 個單位,每個單位有 r i 個代表,有 n 張餐桌,每張餐桌可容納 c i 個代表。要求同乙個單位的代表不在同乙個餐桌就餐。若可以,輸出 1 以及其中一種方案,否則輸出 0 題解 貪心,把餐桌大小和單位人數從小到大排序,因為單位規模越大就越難滿足,所以我們優先考慮他們。而桌子越多越...
洛谷題解P4326 求圓的面積
coci是crotian open competition in informatics,即克羅埃西亞資訊學公開賽。本題的坑點在於有些人不知道所謂的計程車幾何下的 圓 其實是乙個正方形 上面這個 圓 中,中心點到邊上的任意一點的距離都為 x1 x2 y1 y2 4。這個 圓 是由上下兩個三角形組成的...