首页 > 试题广场 >

黄金时期

[编程题]黄金时期
  • 热度指数:257 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
每个人的职业生涯状态有起有落,程序员也如此。

我们对程序员的状态做一个简化,单纯用缺陷密度来衡量一个程序员一天的状态。如果这一天的缺陷密度比平均值高,则认为他这一天的状态差,高出越多,认为状态越差。比平均值低,则认为状态好,低得越多,认为状态越好。人的状态是可以叠加的,如果两个连续时间段的缺陷密度加起来低于平均值,则认为这两个时间段合起来状态是好的。

给定一个程序员很长一段时间中各个时间片段的缺陷密度(V)与平均值(A)的差值(D=V-A),求出该程序员的黄金时间段的缺陷密度差值D的累加和。
缺陷密度差值D如果为正数,表明缺陷密度高于平均值,如果为负数,表明缺陷密度低于平均值。
所谓黄金时间段,指一个连续时间段,这段时间的缺陷密度与平均值的差值D累加起来,在各种划分方法中,是最小的,也即状态是最好的。


输入描述:
第一行给出一个正整数T,表示一共有T个时间段。(1<=T<10000000)
接下来T行数据,每行数据为一个整数,表示这个时间段缺陷密度与平均值的差值(D)。


输出描述:
输出黄金时间段内缺陷密度差值D的累加和(已知D不超过32位整数的表达范围)
示例1

输入

7
2
-3
-4
1
-3
2
-1

输出

-9
其实就是最大区间和问题(这里是最小)。

发表于 2020-05-01 15:05:59 回复(1)
空间复杂度O(1)
直接申请vector<int> (n)的内存会超

#include <algorithm>
#include <iostream>
#include <vector>
 
using namespace std;
 
int main() {   
    int n;
    cin >> n;
    int x;
    cin>>x;
    if(n==1){
        cout << x << endl;
        return 0;
    }
    int res=x;
    int now;
    for (int i = 1; i < n; i++){
        cin>>now;
        int sum=min(x+now, now);
        res=min(sum,res);
        x=sum;
    }
    cout << res << endl;
 
    return 0;
}

编辑于 2020-05-16 20:34:11 回复(0)

C++动态规划

#include 
(849)#include 
#include 
using namespace std;
int main()
{
    int n;
    while(cin>>n)
    {
        vector nums(n,0);
        for(int i=0;i<n;i++)
            cin>>nums[i];
        int min_val = 100000;
        int pre = nums[0];
        int cur;
        for(int i=1;i<n;i++)
        {
            cur = nums[i]+min(0,pre);
            pre = cur;
            min_val = min(cur,min_val);
        }
        cout<<min_val<<endl;
    }
    return 0;
}
发表于 2020-05-01 14:40:00 回复(0)