題目:
牛牛去一個村莊推銷青草,村莊的每家每戶的房屋首尾相連形成環。
由於廣告策略,賣給某個住戶,就不能賣給他的鄰居。
問最多能賣出多少捆青草。
n:住戶數
x[i]:第i戶能購買的青草數量
t:要問多少次這個問題
輸入:
t
(然後t輪問題的輸入與輸出)
n
x[1]……x[n]
輸出:
最大售出數量
#include<stdio.h>
#define MAX 1000//房子數量最大值
int question();
int main()
{
int i;
int t;//詢問數
int s;//問題答案
scanf("%d", &t);
for(i = 0; i<t; i++)
{
s = question();
printf("%d\n", s);
}
return 0;
}
int question()
{
int i;
int n;//房子的數量
int x[MAX];//每棟房子住戶需要購買的青草分數
int sTemp[5] = {0};//暫存各方案的青草分數
int s = 0;//存放答案
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%d", &x[i]);
//當n爲偶數時,有兩種賣出方案
if(n%2 == 0)
{
for(i=0; i<n-1; i=i+2)
sTemp[0] = sTemp[0] + x[i];
for(i=1; i<n; i=i+2)
sTemp[1] = sTemp[1] + x[i];
if(sTemp[0] > sTemp[1])
s = sTemp[0];
else
s = sTemp[1];
}
//當n爲奇數時,有五種賣出方案
if(n%2 == 1)
{
if(n <= 5)
{
for(i=0; i<n-1; i=i+2)
sTemp[0] = sTemp[0] + x[i];
for(i=1; i<n; i=i+2)
sTemp[1] = sTemp[1] + x[i];
for(i=2; i<n; i=i+2)
sTemp[2] = sTemp[2] + x[i];
if(sTemp[0] > sTemp[1]) s = sTemp[0];
else s = sTemp[1];
if(s < sTemp[2]) s = sTemp[2];
}
else
{
for(i=0; i<n-1; i=i+2)
sTemp[0] = sTemp[0] + x[i];
sTemp[1] = sTemp[0] - x[i-2] + x[i-1];
for(i=1; i<n; i=i+2)
sTemp[2] = sTemp[2] + x[i];
sTemp[3] = sTemp[2] - x[i-2] + x[i-1];
for(i=2; i<n; i=i+2)
sTemp[4] = sTemp[4] + x[i];
for(i=0; i<5; i++)
{
if(sTemp[i] >s)
s = sTemp[i];
}
}
}
return s;
}
/***********************************
Author: 張女名
Time: 2018/4/22 22:19
***********************************/