17099 周工作计划安排
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
你正在某信息公司管理一个项目工作团队,每周你必须选择一项工作让团队来承担。 所有的工作分为高压的低压的两类: (1)低压的,诸如,为小学生建立Web管理网站。低压的项目可以获得li万元。 (2)高压的,诸如,涉及国家秘密或大型商业机遇的项目。高压的项目可以获得hi万元。 且高压项目,必须在前一周用一周的时间来准备(前一周不做任何其他工作)。 你作为项目管理者,每周,要选择一项高压的或低压的工作来做。 问题模型:给定一组值l1,l2,...,ln和h1,h2,...,hn,找出一个最大价值的最优计划。
输入格式
第一行:n ( 这里,n<10000 ) 第二行:l1 l2 ... ln 第三行:h1 h2 ... hn
输出格式
团队所能获得的最大价值。
输入样例
4 10 1 10 10 5 50 5 1
输出样例
70 解释: 最优安排:第一周不安排,为第二周高压工作,第二周选择高压工作,第三第四周低压工作。 最优价值:0+50+10+10=70
提示
先定义符号:n个星期,每个星期可选择一个低压项目,或一个高压项目(高压项目前一周不工作) 低压可产生价值:l1 l2 ... ln 高压可产生价值:h1 h2 ... hn 假设d[i]代表第i周选择项目后,产生的最大效益和。 (1)当i=1时,因为无准备周,无法选择高压项目,只能选低压项目来做。d[i]=l1; (2)当i=2时,d[i]=max{l1+l2, h2}; (3)当i>1时,d[i]=max{d[i-1]+li,d[i-2]+hi}。 最后,d[n]就是原问题n个星期选择项目能产生的最大价值和。
我的代码实现:
#include<stdio.h> #define N 10005 int d[N]; //(1)当i=1时,因为无准备周,无法选择高压项目,只能选低压项目来做。d[i]=l1; //(2)当i=2时,d[i]=max{l1+l2, h2}; //(3)当i>1时,d[i]=max{d[i-1]+li,d[i-2]+hi}。 int max(int x,int y){ return x>y?x:y; } void aa(int *low,int *high,int n){ d[1]=low[1]; d[2]=max(low[1]+low[2],high[2]); for(int i=2;i<=n;i++){ d[i]=max(d[i-1]+low[i],d[i-2]+high[i]); } } int main(){ int l[N],h[N]; int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&l[i]); } for(int i=1;i<=n;i++){ scanf("%d",&h[i]); } aa(l,h,n); printf("%d ",d[n]); return 0; }