zoukankan      html  css  js  c++  java
  • Codeforces Round #723 (Div. 2)C1+C2. Potions(dp/贪心)

    传送门

    题目大意:n瓶药水,从左到右开始喝,喝完一瓶健康值+a[i],(a[i]有可能是负数),要保证每喝完一瓶药水后健康值不能为负数。

    问最多喝几瓶。

    题解:

    解法一:DP O(n^2)

    dp[i][j]表示前i瓶药水喝j瓶的最大健康值,则转移方程为dp[i][j]=max(dp[i-1][j-1]+a[i],dp[i-1][j])。

    若dp[i][j]为负数,给它赋值一个负无穷,这样后续状态不会从这个状态转移过去。

    解法二:贪心

    能喝就喝,喝了变成负数了就把之前喝的最小的一瓶吐出来

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
     
    #define LL long long
     
    const LL INF=1e18;
     
    int n;
     
    LL dp[2020][2020];
    int a[2020];
     
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                if(i==j) dp[i][j]=dp[i-1][j-1]+a[i];
                else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+a[i]);
                if(dp[i][j]<0) dp[i][j]=-INF;
            }
        }
        for(int j=n;j>=0;j--)
        {
            if(dp[n][j]>=0)
            {
                cout<<j;
                return 0;
            }
        }
        return 0;
    }
    #include<iostream>
    #include<queue>
    using namespace std;
     
    int n;
     
    priority_queue<int,vector<int>,greater<int>> q;
     
    int main()
    {
        scanf("%d",&n);
        long long res=0;
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            res+=x;
            q.push(x);
            while(res<0)
            {
                int tmp=q.top();
                res-=tmp;
                q.pop();
            }
        }
        printf("%d
    ",q.size());
        return 0;
    }
  • 相关阅读:
    Servlet学习小结
    HTTP学习小结
    SpringMVC第二天
    使用Servlet 编写过滤器
    项目使用框架
    java-web
    SSM框架集成.下(供自己练习查阅用)
    SSM框架集成.中(供自己练习查阅用)
    SSM框架集成.上(供自己练习查阅用)
    debug
  • 原文地址:https://www.cnblogs.com/zzyh/p/14873080.html
Copyright © 2011-2022 走看看