POJ 3061 Subsequence

复制代码
 1 //第一个答案2(5+10) 第二个 3(3+4+5)
 2 //令 sum[i]=a0+a1+...+ai,  as+...+a(t-1)>=S 
 3 //有 as+a(s+1)+...+a(t-1)=sum[t]-sum[s] 
 4 //则 ai+...+an=sum[n]-sum[i]>=S
 5 //所以问题转化成S+sum[i]在sum找 
 6 #include<cstdio>
 7 #include<iostream>
 8 #include<algorithm>
 9 #include<queue>
10 #include<map>
11 #include<vector>
12 #include<set>
13 #include<string>
14 #include<cmath>
15 #include<cstring>
16 using namespace std;
17 int a[100010];
18 int s;
19 int main()
20 {
21     int sum[100010];
22     int cnt;
23     scanf("%d",&cnt);
24     while(cnt--)
25     {
26         int n;
27         scanf("%d%d",&n,&s);
28         for(int i=0;i<n;i++)
29         {
30             scanf("%d",&a[i]);
31         }
32         for(int i=0;i<n;i++)
33         {
34             sum[i+1]=sum[i]+a[i];//0-下标到i的和 
35         }
36     
37         if(sum[n]<s) 
38         {
39             printf("0\n");
40         }
41         else
42         {
43             int res=n; 
44             for(int i=0;sum[i]+s<=sum[n];i++)
45             {
46                 int t=lower_bound(sum+i,sum+n,sum[i]+s)-sum;//因为从sum里找所以是sum[i]+s
47                 //sum+i可以不加,   as+...+at序列就是答案,所以下面是t-i
48                 res=min(res,t-i); 
49             }
50             printf("%d\n",res);
51         }
52     }
53     return 0;
54 }
复制代码
posted @   付玬熙  阅读(75)  评论(0编辑  收藏  举报
历史上的今天:
2019-01-21 UVA 11809 Floating-Point Number
点击右上角即可分享
微信分享提示
主题色彩