牛客网--19校招--获得最多的奖金
題目描述
小明在越南旅游,參加了當地的娛樂活動。小明運氣很好,拿到了大獎, 到了最后的拿獎金環節。小明發現桌子上放著一列紅包,每個紅包上寫著獎金數額。
現在主持人給要求小明在這一列紅包之間“切”2刀,將這一列紅包“切”成3組,并且第一組的獎金之和等于最后一組獎金和(允許任意一組的紅包集合是空)。最終第一組紅包的獎金之和就是小明能拿到的總獎金。小明想知道最多能拿到的獎金是多少,你能幫他算算嗎。
?
舉例解釋:桌子上放了紅包? 1, 2, 3, 4, 7, 10。小明在“4,7”之間、“7,10” 之間各切一刀,將紅包分成3組 [1, 2, 3, 4]? ?[7]? ?[10],其中第一組獎金之和=第三組獎金之和=10,所以小明可以拿到10越南盾。
輸入描述:
第一行包含一個正整數n,(1<=n<= 200 000),表示有多少個紅包。第二行包含n個正整數d[i],表示每個紅包包含的獎金數額。其中1<= d[i] <= 1000 000 000輸出描述:
小明可以拿到的總獎金示例1
輸入
復制
5 1 3 1 1 4輸出
復制
5說明
[1,3,1] [ ] [1,4] ,其中第一組獎金和是5,等于第三組獎金和。所以小明可以拿到5越南盾示例2
輸入
復制
5 1 3 2 1 4輸出
復制
4說明
[1,3] [2,1] [4],小明可以拿到4越南盾示例3
輸入
復制
3 4 1 2輸出
復制
0說明
[ ] [4, 1, 2] [ ] ,小明沒辦法,為了保證第一組第三組相等,只能都分成空的。所以小明只能拿到0越南盾。設置兩個標志,Low,High,分別從前向后,從后向前遍歷,如果前面的紅包值和大時,后面的向前移動一位,加上之后繼續比較。如果后面的紅包值和大時,前面的向后移動一位,加上之后繼續比較。
如果前后當前值相等,記錄下這個值,前后同時向中間動一位,觀察是否還存在相等的情況下更大的紅包值
本題有一組數據很大,int無法存儲,需用long類型或long long類型
#include<stdio.h>
int main()
{
?? ?long long n,Low=0,High,sum1=0,sum2=0,t=0;
?? ?scanf("%lld",&n);
?? ?High=n-1;
?? ?long long a[n],i;
?? ?for(i=0;i<n;i++)
?? ?{
?? ??? ?scanf("%lld",&a[i]);
?? ?}
?? ?sum1=a[Low];
?? ?sum2=a[High];
?? ?while(High>=Low)
?? ?{
?? ??? ?if(sum1>sum2)
?? ??? ?{
?? ??? ??? ?High--;
?? ??? ??? ?sum2+=a[High];
?? ??? ?}
?? ??? ?else if(sum1<sum2)
?? ??? ?{
?? ??? ??? ?Low++;
?? ??? ??? ?sum1+=a[Low];
?? ??? ?}
?? ??? ?else if(sum1==sum2)
?? ??? ?{
?? ??? ??? ?t=sum1;
?? ??? ??? ?Low++;
?? ??? ??? ?High--;
?? ??? ??? ?sum1+=a[Low];
?? ??? ??? ?sum2+=a[High];
?? ??? ?}
?? ?}
?? ?printf("%lld\n",t);
}?
總結
以上是生活随笔為你收集整理的牛客网--19校招--获得最多的奖金的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse中tomcat的简单配置
- 下一篇: Leetcode--264. 丑数Ⅱ