문제 보고서에 GDUT_ 겨울 훈련 솔루션 _ 문제 보고서에 대한 주제 제목 I_A 개인 솔루션
문제 : 테이크 발 (템플릿 제목
주어진 양의 정수 시퀀스 (10 <N <1E5)은 길이 N의 각각의 양의 정수 또는 10,000 이하 동일하고,보다 양의 정수 S (S <1E8). S.보다 같거나 더 큰 서열의 인접한 요소들의 시퀀스의 길이를 최소화하기 위해 프로그램을 작성
입력
첫 번째 라인은 테스트 케이스의 수이다. 각 테스트 케이스의 경우, 반드시 상기 프로그램은 상기 제 1 판독 라인 S 및 N 스페이서 디지털 분리. 테스트 시퀀스 번호 간격에 의해 분리 된 두 번째 행에 주어진다. 결말이 파일의 끝이 될 것입니다 입력합니다.
출력
각각의 경우에 대해, 프로그램의 결과는 출력 파일의 개별 행에 인쇄되어야한다. 응답이없는 경우, 0을 인쇄 할 수 있습니다.
입력 샘플
2
1015
. 7. 10 5 5 4 3 2 1 8.9
. 5. 11
. 1 5 23 4
샘플 출력
(2)
. (3)
분석 : 필요한 힘이 시작되고 N (N-1) / 2 배에 배치 된 종점을 확인하는 경우 일반적인 발 제목을 가지고 있지만, 펜 스트로크는 일부 경우에 분석 될 수는 직렬 (L, R로, 완전히 생략 될 수도 조건이 만족되는 경우), (L은, R + 1), 분명히 불필요 초대 길이 때문이다.
그런데, 결국이 시퀀스의 (1, k)에 대한 사실을 분할하는 방법?
추측 각 요소 내부 프로 서열 세트 각각 (A (1), A ( 1) ... A (N-1)) F (x)의 상태, 시퀀스 요소 L의 단부의 상태 길이 (X)을 만족하는 것을 의미 ,이며, (A (X-L + 1 ) ... A (X)) 이 순서
의 상태 천이 : F (X + 1) F (X)의 단지 테일 (X + 1) 표제하면, 의심 할 여지없이 발생할 것 의미는 그래서, 우리는 (X-L + 1)에서보기 시작의 끝에서 X + 1이기 때문에 사례 분석하지만 , 이 요소는 삭제 될 수 있습니까? 당신이 그것을 삭제 될 수 있다면, 나는 (X + 1) 1 L로,이 단계를 순환 머리가 삭제 될 수 없을 때까지 + 길이 (L)에 f를, 다음 F (X + 1) 자신의 중요성에 도달 :에 + 단부 소자 (1) (X)의 조건을 만족하는 가장 짧은 시퀀스 번호의 길이.
고려 :이 추측이 올바른 것 같다, 모든는 꼬리의 위치를 이동 한 다음 그것에 INT의 _MIN의 값을 업데이트하는 데 사용되는 새 길이, 각, 축소 축소 할 수있을 때까지 머리에서 축소하기 시작했다
이 두 단어의 상태에 대한 이해를 강화하면서 캐터필라 알고리즘, 알고리즘은 매우 흥미로운 발 페치
코드에서 :
using namespace std;
int t,n,s;
int all[100010];
int main()
{
while ( scanf ( "%d", &t ) != EOF )
{
while ( t-- )
{
scanf ( "%d %d", &n, &s );
all[0] = 0;
for ( int time = 1; time <= n; time++ )
{
int num;
scanf ( "%d", &num );
all[time] = all[time - 1] + num;
}
int _Min = n + 1;
int left = 0, right = 1;
if ( all[n] < s )
printf ( "0\n" );
else
{
while ( right <= n )
{
if ( right - left < _Min && all[right] - all[left] >= s )
_Min = right - left;
right++;
while ( all[right] - all[left + 1] >= s )
{
left++;
}
}
printf ( "%d\n", _Min );
}
}
}
return 0;
}