[CF]E. Are You Fired?

E. Are You Fired?

正确解法:

有n个元素,前(n+1)/2个元素分别为ai,后n/2个元素全部为x。求一个数k,是长度为k 的连续子串总和都大于0.

 

分情况讨论。

当x>=0时:

  当k>(n+1)/2 时,肯定n个字串比k个字串更优(x>=0) 求sum[n]

  当k<(n+1)/2 时,长度为k的字串满足条件,长度为2k、3k的字串也满足条件,总能找到一个 xk> (n+1)/2 于是同理 求sum[n]

当x<0时:

  当k<(n+1)/2 时,后面有一串 都为x (x<0) 的 不满足条件。

  当k>(n+1)/2 时,

    k=n  字串为:[1,N]

    k=n-1  字串为:  [1,N-1]  [2,N]

    k=n-2  字串为:  [1,N-2]  [2,N-1]  [3,N]

于是我们枚举 [i,n] 这个长度,(因为每次都多增加了这个,前面的都可以拿前面的-x得到)

  求这些字串的最小值,只要最小值>0 ,便满足条件。

   res=sum[n]-sum[i-1];  //新增的长度。

  minn-=x;  //之前的长度 -x 就等于现在前面的长度

  minn=min(minn,res);  //求这些字串的最小值。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <set>
 6 #include <queue>
 7 #include <stack>
 8 #include <string>
 9 #include <cstring>
10 #include <vector>
11 #include <map>
12 #include<ctime>
13 //#include <unordered_map>
14 #define mem( a ,x ) memset( a , x ,sizeof(a) )
15 #define rep( i ,x ,y ) for( int i = x ; i<=y ;i++ )
16 #define lson  l ,mid ,pos<<1
17 #define rson mid+1 ,r ,pos<<1|1
18 using namespace std;
19 typedef long long ll ;
20 typedef pair<int ,int> pii;
21 typedef pair<ll ,int> pli;
22 const int inf = 0x3f3f3f3f;
23 const ll mod=998244353;
24 const int N=100000+50;
25 int n;
26 ll a[5*N],x,sum[5*N],minn,res;
27 
28 int main()
29 {
30     scanf("%d",&n);
31     for(int i=1;i<=(n+1)/2;i++)
32      {
33         scanf("%lld",&a[i]);
34         sum[i]=sum[i-1]+a[i];
35      }
36     scanf("%lld",&x);
37     for(int i=(n+1)/2+1;i<=n;i++)
38     {
39         a[i]=x;
40         sum[i]=sum[i-1]+a[i];
41     }
42     if(x>=0)
43     {
44         if(sum[n]>0)    printf("%d\n",n);
45         else    printf("-1\n");
46         return 0;
47     }
48     minn=1e18;
49     for(int i=1;i<=n;i++)
50     {
51         res=sum[n]-sum[i-1];
52         if(minn==1e18)
53             minn=res;
54         else
55         {
56             minn-=x;
57             minn=min(minn,res);
58         }
59         if(minn>0)
60         {
61             printf("%d\n",n-i+1);
62             return 0;
63         }
64     }
65     printf("-1\n");
66 
67 
68     return 0;
69 }
View Code

 

posted @ 2020-05-27 15:05  kaike  阅读(363)  评论(0编辑  收藏  举报