1. 程式人生 > >牛客寒假算法基礎集訓營6 美食 (貪心)

牛客寒假算法基礎集訓營6 美食 (貪心)

def 一個 鏈接 return 奇數 題目 pri ace ali

美食

鏈接:https://ac.nowcoder.com/acm/contest/332/D

題目描述

小B喜歡美食。
現在有n個美食排成一排擺在小B的面前,依次編號為1..n,編號為i的食物大小為 a[i] ,即足夠小B吃 a[i] 口。
小B每次會吃兩口,這兩口要麽是編號相同的美食,要麽是編號之差的絕對值為1的美食。
小B想知道,她最多能吃幾次?

輸入描述:

第1行一個正整數n,表示美食個數
接下來n行,第i行一個整數a[i],表示編號為i的美食的大小

輸出描述:

一個數表示小B最多吃幾次。
示例1

輸入

4
1
5
7
8

輸出

10

說明

用二元組(a,b)表示某一次吃的兩個美食分別為第a個美食和第b個美食,則下面為一個吃10次的方案:

(1,2)(2,2)(2,2)(3,4)(3,4)(3,4)(3,4)(3,4)(3,4)(3,4)
註意不一定要吃完。

備註:

技術分享圖片 題解:

i從1到n枚舉,依次貪心。

對於a[i],

首先把答案加上a[i]/2,

如果a[i]是奇數且a[i+1]>0,則把a[i+1]減去1,答案加上1。敲黑板!!一定要註意a[i+1]會小於0不夠減!!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace
std; 6 typedef long long ll; 7 int n; 8 ll a[1000010]; 9 int main() 10 { 11 cin>>n; 12 ll sum=0; 13 14 for(int i=1;i<=n;i++) 15 { 16 scanf("%lld",&a[i]); 17 18 } 19 if(n==1){ 20 printf("%lld\n",a[1]/2); 21 return 0; 22 } 23 for
(int i=1;i<=n;i++) 24 { 25 if(i==1&&a[i]>0) 26 { 27 sum+=a[i]/2; 28 a[i]=a[i]%2; 29 if(a[i]==1&&a[i+1]>0) 30 { 31 sum++; 32 a[i+1]--; 33 } 34 } 35 else if(i==n&&a[i]>0) 36 { 37 sum+=a[i]/2; 38 } 39 else if(a[i]>0) 40 { 41 sum+=a[i]/2; 42 a[i]=a[i]%2; 43 if(a[i]==1&&a[i+1]>0) 44 { 45 sum++; 46 a[i+1]--; 47 } 48 } 49 } 50 printf("%lld\n",sum); 51 return 0; 52 }

牛客寒假算法基礎集訓營6 美食 (貪心)