首页 > 其他分享 >AtCoder Beginner Contest 285 E(背包dp)

AtCoder Beginner Contest 285 E(背包dp)

时间:2023-01-17 19:34:12浏览次数:68  
标签:AtCoder 背包 Beginner min int work Contest dp 10

E - Work or Rest

题目大意:

给定一周有n天,其中至少有1天为休息日,其余为工作日。同时给定一个长度为n的整型数组A,对于一个工作日,它能产生的工作值为A\(_{min(x,y)}\),其中x,y表示离该工作日最近的一个休息日(前一个,后一个)的时间。
求每周工作所能获得的最大工作值。


解题思路:

我们通过举例可以发现:连续的k天工作日所能获得的工作值是固定的
例如:
给定A:10 10 1 1 1 1 1

k = 0:work\(_0\) = 0
k = 1:work\(_1\) = A\(_1\) = 10
k = 2:work\(_2\) = A\(_1\) + A\(_{min(1,2)}\) = 2*A\(_1\) = 20
k = 3:work\(_3\) = A\(_{min(1,3)}\) + A\(_2\) + A\(_{min(3,1)}\) = 2*A\(_1\) + A\(_2\) = 30
k = 4:work\(_4\) = A\(_{min(1,4)}\) + A\(_{min(2,3)}\)+A\(_{min(3,2)}\)+A\(_{min(4,1)}\) = 2*A\(_1\) + 2*A\(_2\) = 40
....
k = d: work = work\(_{d-1}\)+A\(_{(i+1)/2}\)
同时我们发现:对于一周的工作时间和休息的总和为n

所以我们考虑背包:背包的体积为n表示一周的工作时间和休息的总和
物品p = d(体积)表示1天休息+连续(d-1)天所能获得的工作值

dp[i]表示 i 天所能获得的做大工作值


代码实现:

#include<bits/stdc++.h>
using namespace std;
# define int long long
# define endl "\n"
const int N = 2e5 + 10, inf = 1e18;
int pre[N];
int a[N];
void solve() {
	int n;
	cin >> n;
	for(int i = 1;i <= n;++i) cin>>a[i];
	for(int i = 1;i <= n;++i) pre[i] = pre[i-1]+a[(i+1)/2];
//	for(int i = 1;i <= n;++i) cout<<pre[i]<<" \n"[i==n];
	vector<int> f(n+1);
	for(int i = 1;i <= n;++i){
		for(int j = 1;j <= i;++j){
			f[i] = max(f[i],f[i-j]+pre[j-1]);
		}
	}
	
	cout<<f[n]<<endl;
}
int tt;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	tt = 1;
//	cin >> tt;
	while (tt--) solve();


	return 0;
}

标签:AtCoder,背包,Beginner,min,int,work,Contest,dp,10
From: https://www.cnblogs.com/empty-y/p/17058576.html

相关文章

  • AtCoder Beginner Contest 282(G 填坑dp)
    G-SimilarPermutation题目大意:如果两个排列A=(A\(_1\),A\(_2\),A\(_3\)....A\(_N\)),B=(B\(_1\),B\(_2\),B\(_3\)....B\(_N\))满足:(A\(_i\)-A\(_{i+1}\))(B\(_......
  • AtCoder Regular Contest 153(持续更新)
    PrefaceB题粗糙了改了好几个版本,最后索性从头理了一遍思路才过然后剩下40min想C又歪了(构造题精通的被动消失了),还剩25min的时候忍不住了看LPL去了话说现在的ARC感觉和以......
  • AtCoder Beginner Contest 285
    AtCoderBeginnerContest285题目来源A-EdgeChecker2题意判断一个完全二叉树,两个节点是否直接相连分析\(a=b*2或者a=b*2+1(a<b)a、b\)相连voidsolve(){ ......
  • AtCoder Beginner Contest 285 ——D
    题目:D-ChangeUsernames(atcoder.jp)题解:在所有的s[i]和t[i]之间连接一条有向边,由s[i]指向t[i],连接完之后可以发现,会形成若干条链或者环,如果出现了环那么一定不可以实......
  • 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 ARC 061 题解
    C-ManyFormulas题意​ 给出一个长度为10的由数字组成的字符串,你可以把'+'插入到任意位置,将字符串分割,形成一个算式。你有很多分割的方案,现在你需要将所有出现的算式的......
  • AtCoder Beginner Contest 285
    A-EdgeChecker2(abc285a)题目大意给定如下一棵树。给定\(a,b(a<b)\),问两者是否有连边。解题思路观察数可发现其为二叉树,两者有连边当且仅当\(b=2a\)或\(b=2a......