牛客寒假算法基礎集訓營6 美食 (貪心)
阿新 • • 發佈:2019-02-14
def 一個 鏈接 return 奇數 題目 pri ace ali
現在有n個美食排成一排擺在小B的面前,依次編號為1..n,編號為i的食物大小為 a[i] ,即足夠小B吃 a[i] 口。
小B每次會吃兩口,這兩口要麽是編號相同的美食,要麽是編號之差的絕對值為1的美食。
小B想知道,她最多能吃幾次?
美食
鏈接: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 美食 (貪心)