1. 程式人生 > >YTU OJ 2379:反恐精英

YTU OJ 2379:反恐精英

反恐精英

 

題目描述

17125 部隊有N 名戰士, 依次編號為1,2,3 … N, 每名戰士對應一個戰鬥力P(0<=P<=100)。為維持該部隊的正常運轉,規定每次只能派出連續編號的若干個戰士完成指定任務。兩會期間,反動勢力聚集在郊區,試圖製造恐怖事件。為維護兩會的正常開展,總司令命令17125 部隊殲滅該夥恐怖分子。已知派出戰士戰鬥力的總和需大於等於恐怖分子的總戰鬥力M 才可將其殲滅,為便於潛入敵人內部,總司令決定派遣最少數量的戰士來完成此次任務,請你幫總司令決定至少派遣多少名戰士才能完成此次任務。(假設所有戰士均可參與此次任務)

輸入

第一行給出整數T(1<=T<=10) , 表示有T 組資料。每組資料第一行兩個整數N(1<=N<=100000)表示有N 名戰士,M(0<M<100000)表示消滅敵人的戰鬥力下限,第二行給出N 個整數,第i 個數代表標號為i 的戰士的戰鬥力Pi(0<Pi<100)。

輸出

對於每組測試資料,單行輸出完成此任務至少需要的戰士數。若此任務無法完成,輸出-1。

樣例輸入

3
10 20
8 2 1 13 2 5 9 6 3 4
6 30
8 2 1 5 3 4
2 5
3 2

樣例輸出

3
-1
2

//ruler。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int a[1000001];
int main()
{
	int n,m,i,j,k,s;
	
	int t;
	cin>>t;
	while(t--)
	{
		i=0;
		j=0;
		s=0;
		int minz = 1e6;
		cin>>n>>m;
		for(k=0;k<n;k++)
		{
			cin>>a[k];
		}
		while(1)
		{
			while(j<n&&s<m)
			{
				s+=a[j++];
			}
			if(s<m)
			{
				break;
			}
			minz = min(minz,j-i);
			s-=a[i++];
		}
		if(minz==1e6)
		{
			cout<<"-1"<<endl;
		}
		else 
			cout<<minz<<endl;
	}
	return 0;
}