题目传送门 思路: 这是一道贪心算法的策略问题。 贪心策略为: 设最大时间为 maxt,时间总和为 sumt,结果为 anst,则: 如果 maxt≥sumt-maxt,则 anst=2×maxt。 如果 maxt≤sumt-maxt,则 anst=sumt。 code: #include <iostream> #include <cstdio> #include <algorithm> using namespace
【营业记录】时光流韵 也许是一枚能够跨越时空的护符,是先闻其声,或是余音绕梁。 关键词:DP (1) 内容概要 费用提前计算 单调栈 单调队列 斜率优化 (2) 费用提前计算 让我们以 P2365 任务安排 为例。 下文中题目里的费用系数我使用 c_ici 表示。且令 sunTsunT 为 t
链接: P5785 弱化版:P2365 题意: 有 \(n\) 个任务待完成,每个任务有一个完成时间 \(t_i\) 和费用系数 \(f_i\),相邻的任务可以被分成一批。从零时刻开始这些任务会被机器分批完成,在每批任务开始前机器有一个给定启动时间 \(s\),一批任务的完成时间是这批任务完成时间之和,同一批任务视作
链接: P5785 弱化版:P2365 题意: 有 \(n\) 个任务待完成,每个任务有一个完成时间 \(t_i\) 和费用系数 \(f_i\),相邻的任务可以被分成一批。从零时刻开始这些任务会被机器分批完成,在每批任务开始前机器有一个给定启动时间 \(s\),一批任务的完成时间是这批任务完成时间之和,同一批任务视作
题面传送门 挺水的题,但是没开long long就WA了一发。 首先我们考虑如何确定最佳烘焙顺序,这样才能用乱七八糟的数据结构维护。 设第\(i\)个蛋糕烘焙完的时间是\(t_i\),那么这个蛋糕的费用就是\(l_i-t_i\) 把全部加在一起我们就可以发现我们其实可以把这两个分开算,即用\(SumL\)减去\(S
嘟嘟嘟 如果常规dp,\(dp[i][j]\)表示前\(i\)个任务分\(j\)组,得到 \[dp[i][j] = min _ {k = 0} ^ {i - 1} (dp[k][j - 1] + (s * j + sumt[i]) * (sumc[i] - sumc[k])) \] 复杂度是\(O(n ^ 3)\)的。 因此我们要换一个思路。 在执行一批任务时,我们虽然不知道之前机器启动过多少次,
任务安排2 题意 \(N\)个任务排成一个序列,分成若干批,执行一批任务所需的时间是启动时间加上每个任务所需时间之和。 同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数\(C_i\)。 求最小的总费用。 思路 设f[i][j]为把前i个任务分成j批的最小费用。 f[i][j
\(\large斜率优化dp\) //P2365 #include<cstdio> #define ll long long using namespace std; ll f[5010],sumt[5010],sumc[5010]; int n,s; ll min(int a,int b){return a<b?a:b;} signed main(){ int n,s,t,c; scanf("%d%d",&n,&s); for
任务安排1(小数据):https://www.luogu.com.cn/problem/P2365 任务安排2(大数据):https://www.luogu.com.cn/problem/P5785 题目描述 有 \(N\) 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。机器会把这 \(N\) 个任务分成若干批,每一批包含连续的若干个任务。从时刻 \(0\)
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 1 #include<stdio.h> 2 int main(){ 3 char c; 4 int sumt=0,t[10],count,i; 5 scanf("%c",&c); 6 while(c!='\0'&&c!='\n'){ 7 sumt += (c-'
这道题不太一样了。通过费用提前可以推倒递推式长这样:f[i]=min{f[j]+sumt[i]*(sumc[i]-sumc[j])+s*(sumc[n]-sumc[j])} 写成一次函数形式长这样:f[j]=(s+sumt[i])*sumc[j]+f[i]-sumt[i]*sumc[i]-s*sumc[n] 但是我们发现由于t不在保证是正数,sumt[i]也没有单调性,那么就只好二分求答案
斜率优化dp的本质还是dp 只是转移耗时太大,我们需要根据其转移方程优化 两种常见的计算斜率的方法: 1.作差比较法 举个例子 当前我们的dp转移方程为:(最后求f[n]f[n]f[n]的最小值) f[i]=f[j]+(sumt[i]+s)∗(sumc[i]−sumc[j])f[i]=f[j]+(sumt[i]+s)*(sumc[i]-sumc[j])f[i]=f[j]+