zoukankan      html  css  js  c++  java
  • [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);
    45         else    printf("-1
    ");
    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-i+1);
    62             return 0;
    63         }
    64     }
    65     printf("-1
    ");
    66 
    67 
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    java入门了解14
    java入门了解13
    java入门了解12
    java入门了解11
    Hive-安装
    Hive-基本概念
    Java笔记20
    Java-笔记19
    Java-笔记18-复习
    Java-笔记18
  • 原文地址:https://www.cnblogs.com/Kaike/p/12973185.html
Copyright © 2011-2022 走看看