#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<bits\stdc++.h>
#include<math.h>
using namespace std;
int a[10010];
int main() {
int i,j,n,t,num;
scanf("%d%d",&n,&t);
long long sum=0,minimum=0;
for(j=0;j<n;j++){
scanf("%d",&a[j]);
}
i=0;j=1;sum=a[i]+a[j];minimum=sum;
if(a[i]>=t){
printf("%d",a[i]-t);
return 0;
}
while(j!=n-1){
if(sum>t){
minimum=min(sum-t,abs(minimum-t))+t;
sum=sum-a[i];
minimum=min(abs(sum-t),abs(minimum-t))+t;
i++;
}
else if(sum==t){
printf("0");
return 0;
break;
}
else{
minimum=min(t-sum,abs(minimum-t))+t;
sum=sum+a[j+1];
minimum=min(abs(t-sum),abs(minimum-t))+t;
j++;
}
}
printf("%d \n",abs(minimum-t));
return 0;
}
在代码中 主要的就是I和J的移动
为了遍历完全部靠近好感度的连续区间所以while条件就是j!=n-1
有两种情况一种是因为中间遇到一个很大的数 大到可以i到j的两倍
在这种情况下 就会i到j前面 这时候sum为0一定是小于t的
不过j也会移动知道j在i前面 形成一种稳态
主要的思想就是利用双指针不断地缩小于t的距离
可以把所有的ai 看成是一个个线段 而t是线段上的一个点
要一段连续的线段和相加最靠近t
里面还有一点博弈论 往最优的道路走