一起去打CS (区间型DP?)

【问题描述】
早就和lyk约好了去打cs,一直没找着时间,终于今天我家没人,他家也没人,总算可以出去了。但是偏偏天公不作美,某某人非要留那么多题要做。没办法只能尽快做完然后抓紧时间吧……
为了尽量节省时间,我俩决定分开做所有题吧(嘿嘿,稍微耍一下滑~~)。但是有的题我比较擅长,而有的题lyk要比我做的快。所以为了尽快做完所有的题,我们要好好的分配一下。现在给出你要做题 的数目和我俩分别做每个题所需要的时间。希望你帮忙计算一下,我们最少需要多长时间才能做完所有的题去打cs啊!!!
【输入格式】cs.in
第一行一个正整数n,表示有n个题要做。
接下来有n行,每行两个正整数ai,bi。 分别表示我和lyk做每个题所用的时间。
【输出格式】cs.out
一个数,最少需要多长时间才能去打CS。
【输入样例】
3
5 10
6 11
7 12
【输出样例】
12
【输入输出样例解释】
我完成题目1和题目2,时间为11。lyk完成题目3,时间为12。
或者 我完成题目1和题目3,时间为12。lyk完成题目2,时间为11。
【数据规模】
30%的数据满足:1 <= n <= 20
100%的数据满足:1 <= n <= 200 , 1 <= ai,bi <=200

我们先考虑这样一道题目,对于两个数组A,B,需要通过操作【将A数组的第i个元素和B数组的第i个元素互换】,从而达到两数组差值最小。
显然是一道DP题,我们可以枚举每一次A数组的情况从而计算此时B数组的情况。
这道题目同理,只需枚举每一种“我”的情况即可。
map[i,j] 代表一共做i个工作时,我做j时间,值为lyk做剩下题目的时间。

AC CODE

var n,i,j,ans:longint;
a,b:array[-1..201]of longint;
map:array[-1..201,-201..40001]of longint;
function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
begin
read(n);
for i:=1 to n do read(a[i],b[i]);
for i:=1 to n do map[0,0]:=map[0,0]+b[i];
for i:=0 to n do
for j:=0 to 40000 do begin
if j>=a[i] then map[i,j]:=min(map[i-1,j]+b[i],map[i-1,j-a[i]])
else map[i,j]:=map[i-1,j]+b[i];
end;
ans:=maxlongint;
for i:=0 to 40000 do ans:=min(max(map[n,i],i),ans);
write(ans);
end.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值