• Codeforces 922E


    有N颗树,第i颗树上有(c_i)只鸟,召唤师每召唤一只该树上的鸟,法力上限增加B(常数),消耗法力(cost_i)
    召唤师从第1颗树到第N颗,每到一棵树回复法力值X,求最多召唤多少只鸟
    input: (n, W, B, X(1 leq n leq 10^3, 0 leq W, B, X, leq 10^9))
    (c_1, c_2...c_n(0 leq c_i leq 10^4))
    (cost_1, cost_2...cost_n(0 leq cost_i leq 10^9))

    第一想法显然用(dp[N][sum c_i])表示最终答案
    显然需要想明白,这个复杂度是可以接受的
    虽然是三重循环,但复杂度只有(O(nsum _{i=1} ^n c_i))

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    
    const int maxn = 1e3 + 10;
    const int maxm = 1e4 + 10;
    
    int A[maxn], cost[maxn];
    LL dp[maxn][maxm];
    
    int sum, ans;
    LL N, W, B, X;
    
    int main() {
    	scanf("%lld%lld%lld%lld", &N, &W, &B, &X);
    	for (int i = 1; i <= N; i++) scanf("%d", &A[i]), sum += A[i];
    	for (int i = 1; i <= N; i++) scanf("%d", &cost[i]);
    	memset(dp, -1, sizeof(dp)); ans = 0;
    	dp[0][0] = W;
    	for (int i = 1; i <= N; i++) {
    		for (int j = 0; j <= sum; j++) {
    			for (int k = 0;  k <= min(j, A[i]); k++) {
    				if (dp[i - 1][j - k] == -1) continue;
    				LL t = min(W + (j - k) * B, dp[i - 1][j - k] + X) - (LL)cost[i] * k;
    				if (t < 0) continue;
    				dp[i][j] = max(dp[i][j], min(W + j * B, t));
    				ans = max(ans, j);
    			}
    		}
    	}
    	printf("%d
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    配置管理-SVN使用指南-Linux
    配置管理-SVN权限详解
    配置管理-SVN使用指南
    Unity3d之Mecanim(新版动画系统)
    Unity3d之Animation(动画系统)
    iTween基础之iTweenPath(自定义路径移动)
    iTween基础之Color(变换颜色)
    unity工具IGamesTools之批量生成帧动画
    unity2d之2d帧动画创建
    iTween基础之Fade(淡入淡出)
  • 原文地址:https://www.cnblogs.com/xFANx/p/9551011.html
Copyright © 2020-2023  润新知