设人数为 n。
当 n%3 != 2 时,每三个人里面可以确定两个人。
当 n%3 == 2 时,每三个人里面只可以确定一个人。
此时需要就需要枚举了,详见代码。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
int a[100020] = {0};
int s[100020] = {0};
int t[100020] = {0};
int n;
bool judge(int v,int q)
{
int i;
t[q] = v;
if(q >= 2)
{
if(a[q-1] == -1)
{
t[q-1] = s[q-1]-t[q]-a[q-2];
}
else
{
t[q-1] = a[q-1];
}
}
for(i = q-2;i >= 1; --i)
{
if(a[i] == -1)
{
t[i] = s[i+1] - t[i+1] - t[i+2];
if(t[i] < 0)
return false;
}
else
{
t[i] = a[i];
if(t[i] + t[i+1] + t[i+2] != s[i+1])
return false;
}
}
if(a[q+1] == -1)
{
t[q+1] = s[q+1]-t[q]-a[q+2];
}
else
{
t[q+1] = a[q+1];
}
for(i = q+2;i <= n; ++i)
{
if(a[i] == -1)
{
t[i] = s[i-1] - t[i-1] - t[i-2];
if(t[i] < 0)
return false;
}
else
{
t[i] = a[i];
if(t[i] + t[i-1] + t[i-2] != s[i-1])
return false;
}
}
return true;
}
int main()
{
int m,i,q;
while(scanf("%d",&n) != EOF)
{
for(i = 1;i <= n; ++i)
{
scanf("%d",&a[i]);
}
for(i = 1;i <= n; ++i)
{
scanf("%d",&s[i]);
}
if(n%3 != 2)
{
for(i = 3;i <= n; i += 3)
{
a[i] = s[i-1] - s[i-2] + a[i-3];
}
for(i = n-2;i >= 0; i -= 3)
{
a[i] = s[i+1] - s[i+2] + a[i+3];
}
scanf("%d",&m);
while(m--)
{
scanf("%d",&q);
q++;
if(a[q] == -1)
{
printf("%d\n",s[q]-a[q+1]-a[q-1]);
}
else
{
printf("%d\n",a[q]);
}
}
}
else
{
for(i = 3;i <= n; i += 3)
{
a[i] = s[i-1] - s[i-2] + a[i-3];
}
scanf("%d",&m);
while(m--)
{
scanf("%d",&q);
q++;
if(a[q] != -1)
{
printf("%d\n",a[q]);
}
else
{
int temp;
if((q-1)%3 == 0)
{
temp = (s[q] + s[q+1] - a[q-1] - a[q+2])/2;
for(i = temp;i >= 0; --i)
{
if(judge(i,q))
{
break;
}
}
}
else
{
temp = (s[q] + s[q-1] - a[q+1] - a[q-2])/2;
for(i = temp;i >= 0; i--)
{
if(judge(i,q))
{
break;
}
}
}
printf("%d\n",i);
}
}
}
}
return 0;
}