【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划

【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题

Description

过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一样找到了工作. 他们的月薪是M (1 <= M <= 1000) 元. 他们的题目是一流的难题,所以他们得找帮手.帮手们不是免费的,但是他们能保证在一个月内作出任何题目.每做一道题需要两比付款, 第一笔A_i(1 <= A_i <= M) 元在做题的那一个月初支付, 第二笔B_i元(1 <= B_i <= M)在做完后的下一个月初支付. 每一个月牛们用上一个月挣的钱来付款. 牛没有任何存款意识, 所以每个月的节余都回拿用去买糖吃掉了. 因为题目是相互关连的,它们必须按大概顺序解出. 比如,题目3必须在解题目4 之前或同一个月解出. 找出牛们做完所有题目并支付完所有款项的最短月数.

Input

* 第一行: N 和 P

* 第2...P+1行: 第i行包含A_i和B_i, 分别是做第i道题的欲先付款和完成付款.

Output

* 第一行: 牛们做完题目和付完帐目的最少月数

Sample Input

100 5

40 20

60 20

30 50

30 50

40 40

输入解释:

牛们的月薪是100元. 他们有5道题目要做, 预期付款分别为 40, 60, 30, 30,

40, 完成付款分别为 20,本20, 50, 50, 40.

Sample Output

6

HINT

题解:发现动规有点不会做了。

先一组数据证明贪心使错的

50 5
40 10
10 40
10 5
10 3
10 2

于是采用动态规划,用f[i][j]表示最后一个月做[i,j]内的所有题所需要的总天数,于是三重for循环转移,还要判断一下是否需要隔一个月才能做这些题

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n,p,ans;
int a[1010],b[1010],sa[1010],sb[1010];
int f[310][310];
int main()
{
    scanf("%d%d",&n,&p);
    int i,j,k;
    for(i=1;i<=p;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
        sa[i]=sa[i-1]+a[i],sb[i]=sb[i-1]+b[i];
    }
    memset(f,0x3f,sizeof(f));
    for(i=1;i<=p;i++)
        if(sa[i]<=n&&sb[i]<=n)
            f[i][1]=1;
    ans=1<<30;
    for(i=1;i<=p;i++)
    {
        for(j=1;j<=i;j++)
        {
            for(k=1;k<j;k++)
            {
                if(sa[i]-sa[j-1]<=n&&sb[i]-sb[j-1]<=n)
                f[i][j]=min(f[i][j],f[j-1][k]+2);
                if(sa[i]-sa[j-1]+sb[j-1]-sb[k-1]<=n&&sb[i]-sb[j-1]<=n)
                f[i][j]=min(f[i][j],f[j-1][k]+1);
            }
            if(i==p)    ans=min(ans,f[i][j]);
        }
    }
    printf("%d",ans+2);
    return 0;
}
时间: 2024-10-12 14:52:07

【BZOJ1700】[Usaco2007 Jan]Problem Solving 解题 动态规划的相关文章

[bzoj1700]: [Usaco2007 Jan]Problem Solving 解题

不能贪心!不能贪心!不能贪心! 反正有反例(有的题目月初支付款很少,月末支付款很大,和前面的题凑到一个月的话可能导致下个月写不了= =这时放后一个月,和后面的题一起开始写可能更优) 比如: 50 440 15 1043 301 10 老老实实DP吧...f[i][j]表示在第i月过后,共解决了j道题,第i月结余(可用于下个月的月初支付)的最大值.cost0[].cost1[]分别表示月初支付和月末支付 f[i][j]=max{m-sum(cost1[k+1]....cost1[j])},(前提是

bzoj 1700: [Usaco2007 Jan]Problem Solving 解题 ——dp

Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一样找到了工作. 他们的月薪是M (1 <= M <= 1000) 元. 他们的题目是一流的难题,所以他们得找帮手.帮手们不是免费的,但是他们能保证在一个月内作出任何题目.每做一道题需要两比付款, 第一笔A_i(1 <= A_i <= M) 元在做题的那一个月初支付, 第二

bzoj 1700: [Usaco2007 Jan]Problem Solving 解题【dp】

很像贪心的dp啊 这个定金尾款的设定让我想起了lolita和jk制服的尾款地狱-- 设f[i][j]为从j到i的付定金的最早月份然后从f[k][j-1]转移来,两种转移f[i][j]=min(f[i][j],f[j-1][k]+1)是当前这个月付[k-1,j-1]的尾款和[j,i]的定金,f[i][j]=min(f[i][j],f[j-1][k]+2)是先付[k-1,j-1]的尾款,下个月再付[j,i]的定金 然后答案要+2,是最后一次付定金的尾款加上第一个月没有工资 #include<iost

【bzoj1700】Problem Solving 解题

题目描述 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地说,他们有P (1 <= P <= 300) 道题目要做. 他们还离开了农场并且象普通人一样找到了工作. 他们的月薪是M (1 <= M <= 1000) 元. 他们的题目是一流的难题,所以他们得找帮手.帮手们不是免费的,但是他们能保证在一个月内作出任何题目.每做一道题需要两比付款, 第一笔A_i(1 <= A_i <= M) 元在做题的那一个月初支付, 第二笔B_i元(1

General Problem Solving Techniques [Intermediate-1]~A - Children&#39;s Game

There are lots of number games for children. These games are pretty easy to play but not so easy to make. We will discuss about an interesting game here. Each player will be given N positive integer. (S)He can make a big integer by appending those in

[bzoj 1699] [Usaco2007 Jan]Balanced Lineup排队

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1699 [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1443  Solved: 920[Submit][Status][Discuss] Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一

【POJ 3265】Problem Solving

Problem Solving Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1645   Accepted: 675 Description In easier times, Farmer John's cows had no problems. These days, though, they have problems, lots of problems; they have P (1 ≤ P ≤ 300) pro

[BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线

1614: [Usaco2007 Jan]Telephone Lines架设电话线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1806  Solved: 773[Submit][Status][Discuss] Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N <= 1,000)根按1..N顺次编号的废

bzoj 1699: [Usaco2007 Jan]Balanced Lineup排队 分块

1699: [Usaco2007 Jan]Balanced Lineup排队 Time Limit: 5 Sec  Memory Limit: 64 MB Description 每天,农夫 John 的N(1 <= N <= 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 <= Q <= 180,000) 个可能的牛的