題目描述
背景
眾所周知,潘帕斯草原是雄鷹翱翔的地方,那裡有很多的鷹,@潘帕斯雄鷹為了展示自己的與眾不同將自己的羽毛進行了染色,由此給自己引來了麻煩
題目
在潘帕斯草原上牛甚多,他們統治著草原的中心部分,鷹的領地環繞著牛所在的地方,而且每個鷹都有一片自己的領地。在@潘帕斯雄鷹將羽毛進行染色後,其他的鷹紛紛效仿,也想把自己的羽毛染成五顏六色。但是問題隨之而來,相鄰的兩個鷹(1和2相鄰,1和n也是相鄰的)如果發現對方身上有和自己有一樣顏色的羽毛就會和對方進行一場你死我活的空中戰鬥。為了避免這種情況必須要想一種辦法才行。由於@潘帕斯雄鷹是第一個將羽毛進行染色的鷹,他被鷹們指派去買顏料(自費T_T),買顏料當然是要花錢的。@潘帕斯雄鷹想盡量的少買顏料。他發現由於各個鷹的喜好不同,他們想在身上染的顏色種類的個數也是不一樣的,有些鷹喜歡把自己的羽毛塗的顏色多些,有些則少。通過統計得出了第i個鷹想在自己身上塗Ai種顏色。你現在的任務是維護世界和平找到最少的顏色種類使得每個相鄰的鷹身上的羽毛顏色都可以沒有相同的。 輸入格式
第一行n(1<=n<=20000)
第二行開始每行有一個數ai(1<=ai<=100000)表示第i個鷹要在身上塗ai種顏色 輸出格式
一個數,即最少的滿足條件的顏色種類 範例輸入
4 2 2 1 1 範例輸出
4
三維狀態映像
引用barty的題解:
數學方法
因為相鄰的不能有重複顏色,所以顏色種數至少是相鄰兩個的羽毛數總和
又考慮一共有m根羽毛,相同顏色的羽毛最多有(N div 2)根,因此顏色至少有m div (N div 2)種{注意是上取整}。
完。
#include<stdio.h> #include<math.h> int ans; int a[20001],m,n,i,j; int main() { scanf("%d",&n); for (i=1;i<=n;++i) scanf("%d",&a[i]); for (i=1;i<n;++i) if (a[i]+a[i+1]>ans) ans=a[i]+a[i+1]; for (i=1;i<=n;++i) m+=a[i]; double mm=m,nn=n,tem; tem=ceil(mm/((int)(nn/2))); if ((int)tem>ans) ans=(int)tem; printf("%d/n",ans); return 0; }