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

2379: 反恐精英

2379: 反恐精英

時間限制: 1 Sec  記憶體限制: 128 MB
提交: 160  解決: 30
[提交][狀態][討論版][命題人:外部匯入]

題目描述

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

#include<stdio.h>
int min(int a, int b)
{
    return (a < b ? a : b);
}
int main()
{
    int t, n, m, i, j, a[100010];
    scanf("%d", &t);
    while(t--)
    {
        int sum = 0, ans = 99999999;
        scanf("%d%d", &n, &m);
        for(i = 0; i < n; ++i)
        {
            scanf("%d", &a[i]);
        }
        j = 0;
        for(i = 0; i < n; ++i)
        {
            sum += a[i];
            if(sum >= m)
            {
                while(sum-a[j] >= m)
                {
                    sum -= a[j];
                    ++j;
                }
                ans = min(ans, i - j + 1);
            }
        }
        if(ans != 99999999)
            printf("%d\n", ans);
        else
            printf("-1\n");
    }
    return 0;
}