题意:给出一个数组中某些位,再给出数组中连续三个数的和,求每个位置的数可能的最大值。
思路:参考了http://www.cnblogs.com/wangfang20/p/3335651.html
又一次傻逼一样的把变量名写错了debug一个下午
代码
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<map>
#include<set>
#include<list>
#include<stack>
#include<algorithm>
#include<queue>
#include<vector>
#include<time.h>
#include<iomanip>
#include<assert.h>
using namespace std;
const int maxn = 100015;
int maxv[maxn];
int n;
int sumv[maxn];
bool sure[maxn];
void R(int i)
{
while(i+3 < n+1){
sure[i+3] = 1;
maxv[i+3] = sumv[i+2] - sumv[i+1] + maxv[i];
i = i+3;
}
}
void L(int i)
{
while(i-3 >=1){
sure[i-3] = 1;
maxv[i-3] = sumv[i-2] - (sumv[i-1] - maxv[i]);
i = i-3;
}
}
int main()
{
// freopen("data.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
memset(maxv,0,sizeof(maxv));
memset(sure,0,sizeof(sure));
for(int i = 1; i < n+1;++i){
int a;
scanf("%d",&a);
maxv[i] = a;
if(a>=0)sure[i] = 1;
}
for(int i = 1; i < n + 1;++i){
scanf("%d",&sumv[i]);
}
R(0);
L(n+1);
int pos = -1;
for(int i = 0;i<=n;++i){
if(maxv[i] >=0 && maxv[i+1] >=0) {sure[i] = 1;sure[i+1] = 1;pos = i;break;}
}
if(pos >= 0){
for(int j = pos + 2;j < n+1;++j){
maxv[j] = sumv[j-1] - maxv[j-1] - maxv[j-2];
sure[j] = 1;
}
for(int j = pos - 1;j>=1;--j){
maxv[j] = sumv[j+1] - maxv[j+1] - maxv[j+2];
sure[j] = 1;
}
}
for(int i = 0; i <= n+1;++i)if(maxv[i]>=0)sure[i] = 1;
int min1 = 0;
int min2 = 0;
if(!sure[1])maxv[1] = 0;
if(!sure[2])maxv[2] = 0;
for(int i = 4; i <= n;i+=3){
if(sure[i])continue;
maxv[i] =maxv[i-3] - sumv[i-2] +sumv[i-1];
min1 = max(min1,-maxv[i]);
}
for(int i = 5; i <= n ;i+=3){
if(sure[i])continue;
maxv[i] = maxv[i-3] - sumv[i-2] +sumv[i-1];
min2 = max(min2,-maxv[i]);
}
int m;
scanf("%d",&m);
while(m--){
int p;
scanf("%d",&p);
p++;
if(sure[p])
printf("%d\n",maxv[p]);
else if(p%3 == 1){
printf("%d\n",sumv[1] - min2 +maxv[p]);
} else {
printf("%d\n",sumv[1] - min1 + maxv[p]);
}
}
}
return 0;
}