首页 > 其他分享 >ABC 285 E

ABC 285 E

时间:2023-01-16 16:58:22浏览次数:45  
标签:pre ABC 产出 len long calc 285

题面

在某个世界里,一周有 $ N $ 天。
有一个工厂,为了最大化工人的产出,决定合理安排工作日和休息日。
他们根据统计,发现:
对于每个工作日,如果最近的一个休息日距离他有 $ i $ 天,则产出为 $ A_i $ ;
对于每个休息日,产出为 0。
问一周的最大产出。

思路

dp!dp!dp!
设 $ f_i $ 为前 $ i $ 天的最大总产出(第 $ i $ 天是假期),那么我们遍历 $ i \in 1 \ldots n $ ,
设 $ j $ 为假期与假期间的长度,则可得转移方程 $ f_i = f_{i - j - 1} + \operatorname{calc} (j) $ ,其中 $ \operatorname{calc} (j) $ 表示长度 $ j $ 的一段的总产出。
$ \operatorname{calc} $ 函数可以直接用前缀和求。
那么就完了。

代码

// Problem: E - Work or Rest
// Contest: AtCoder - AtCoder Beginner Contest 285
// URL: https://atcoder.jp/contests/abc285/tasks/abc285_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;

long long a[10005];
long long pre[10005];
long long f[10005];

long long calc(long long len) {
	if (len & 1) {
		return pre[len / 2] + pre[len / 2 + 1];
	} else {
		return pre[len / 2] + pre[len / 2];
	}
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
		pre[i] = pre[i - 1] + a[i];
		a[i + n] = a[i];
	}
	for (int i = n + 1; i <= 2 * n; i++) {
		pre[i] = pre[i - 1] + a[i];
	}
	long long ans = -0x3f3f3f3f3f3f3f3fll;
	for (int i = 2; i <= n; i++) {
		f[i] = -0x3f3f3f3f3f3f3f3fll;
		for (int j = 0; j < i; j++) {
			f[i] = max(f[i], f[i - j - 1] + calc(j));
		}
	}
	printf("%lld", f[n]);
}

标签:pre,ABC,产出,len,long,calc,285
From: https://www.cnblogs.com/AProblemSolver/p/17055802.html

相关文章

  • Atcoder ABC285 赛后总结
    A—EdgeChecker2传送门题目大意给你一棵树,输入两个\(1-15\)的数\(a,b\),求\(a\)是否是\(b\)老爹父亲这颗树如图:题目解法超级无敌暴力法(wu一种最最最简......
  • AtCoder Beginner Contest 285 题解
    比赛链接:https://atcoder.jp/contests/abc285总体来说不算难。A-C略。\(D\)因为起点终点不同,起点之间、终点之间两两不同,所以有环的情况是错的,其他都是对的。写起来的......
  • AtCoder Beginner Contest 285 解题报告
    AtCoderBeginnerContest285解题报告\(\text{DaiRuiChen007}\)ContestLinkA.EdgeChecker2假设\(a\geb\),当且仅当\(\left\lfloor\dfraca2\right\rfloor=b\)......
  • AtCoder Beginner Contest 285 D - Change Usernames(拓扑排序)
    这题想到可以用map容器将string与一个端点下标对应,再建一个有向图,将问题转换成判断一个有向图是否有环赛后补题网上搜如何判断图是否有环,学到了拓扑排序拓扑排序是什么......
  • AtCoder Beginner Contest 285
    A-EdgeChecker2(abc285a)题目大意给定如下一棵树。给定\(a,b(a<b)\),问两者是否有连边。解题思路观察数可发现其为二叉树,两者有连边当且仅当\(b=2a\)或\(b=2a......
  • ABC 285 ABCD
    https://atcoder.jp/contests/abc285/tasksA-EdgeChecker2题目大意:二叉树,给定两个数字,问其中一个是否和另一个数字直接连线?也即是是否是父节点?SampleInput1......
  • abc243 E - Edge Deletion
    题意:给定无重边无自环的带正权无向连通图,问最多删除几条边能保持所有点对的最短距离不变\(n\le300\)思路:删除边\(u\overset{w}{-}v\)当且仅当原图中存在其它路径的......
  • ARC153 ABC 题解
    A【题意】给定\(N\),求第\(N\)个满足以下条件的数:它是一个\(9\)位数,没有前导\(0\)。它的第一位等于它的第二位。它的第五位等于它的第六位。它的第七位等于它......
  • Atcoder abc275F
    Atcoderabc275F题意:给出一个长度为\(n\)的数组\(A=(a_1​,a_2​,…,a_N)\),问是否能通过删掉一些子段使剩下的数之和为\(q\)。若可以,求出最小操作次数,否则输出−1......
  • AcWing 第 86 场周赛 ABC
    https://www.acwing.com/activity/content/competition/problem_list/2794/4794.健身#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpa......