题目描述

过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目.

精确地说,他们有\(P(1 \leq P \leq 300)\)道题目要做. 他们还离开了农场并且象普通人一样找到了工作. 他们的月薪是\(M(1 \leq M \leq 1000)\) 元.

他们的题目是一流的难题,所以他们得找帮手.帮手们不是免费的,但是他们能保证在一个月内作出任何题目.

每做一道题需要两笔付款, 第一笔\(A_i(1 \leq A_i \leq M)\)元在做题的那一个月初支付, 第二笔\(B_i\)元\((1 \leq B_i \leq M)\)在做完后的下一个月

初支付. 每一个月牛们用上一个月挣的钱来付款. 牛没有任何存款意识, 所以每个月的节余都回拿用去买糖吃掉了.

因为题目是相互关连的,它们必须按顺序解出. 比如,题目3必须在解题目4之前或同一个月解出.

找出牛们做完所有题目并支付完所有款项的最短月数.

输入输出格式

输入格式

第一行: N 和 P;

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

输出格式

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

样例

INPUT

100 5

40 20

60 20

30 50

30 50

40 40

OUTPUT

6

HINT

SOLUTION

dp(应该算区间dp吧qwq)

第一眼看这题怎么乱七八糟的,为什么这个月的决策会影响到下个月的决策啊,这不是后效性吗,那怎么可能是dp啊。

于是瞎模拟乱写。于是不会。

到网上找了官方题解。。先贴个链接吧qwq

「官方题解传送门」

所以这里我用的就是官方题解的第一种解法:\(O(n^3)\)的解法。

首先我们的\(dp\)数组开两维,\(dp[i][j]\)表示完成从第\(i\)题到第\(j\)题所用的最少月份数。

然后我们就从\(dp[k][i-1]\space (1 \leq k<i)\)转移而来,再就是判定一下一个月能不能做完不能就空一个月,能做完就接上直接+1,然后再所有合法的情况中取\(min\)值就好了。

所以这应该算区间dp吧qwq。

其实这题这么一说看上去好像真的没啥难度,但是当时看那个乱七八糟的支付规则我还真没想到直接这么转移就好了。这也算挺好的一题吧。

我的代码和官方的代码不一样qwq:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
#define Max(a,b) ((a>b)?a:b)
#define Min(a,b) ((a<b)?a:b)
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-48;ch=getchar();}
return x*f;}
const int N=310;
int n,m,dp[N][N],fst[N],snd[N],sum1[N],sum2[N];
inline int jud(int l,int mid,int r){
int cnt=sum2[mid-1]-sum2[l-1]+sum1[r]-sum1[mid-1];return (cnt<=m);}
inline int jud2(int l,int r){
int cnt=sum1[r]-sum1[l-1];if (cnt>m) return 0;
cnt=sum2[r]-sum2[l-1];if (cnt>m) return 0;
return 1;}
int main(){
int i,j;
m=read();n=read();sum1[0]=0;sum2[0]=0;
for (i=1;i<=n;++i) {fst[i]=read();sum1[i]=sum1[i-1]+fst[i];
snd[i]=read();sum2[i]=sum2[i-1]+snd[i];}
memset(dp,0x3f,sizeof(dp));
for (i=1;i<=n;++i) if (jud2(1,i)) dp[1][i]=2;else break;
for (i=2;i<=n;++i){
for (j=i;j<=n;++j){
if (!jud2(i,j)) continue;
for (int k=1;k<i;++k){
if (jud(k,i,j)) dp[i][j]=Min(dp[i][j],dp[k][i-1]+1);
else if (jud2(k,i-1)) dp[i][j]=Min(dp[i][j],dp[k][i-1]+2);
}
}
}
int ans=2*n+1;
for (i=1;i<=n;++i) ans=Min(ans,dp[i][n]);
printf("%d\n",ans+1);
return 0;
}

Luogu_2876_[USACO07JAN]解决问题Problem Solving的更多相关文章

  1. P2876 [USACO07JAN]解决问题Problem Solving

    传送门 显然的 $dp$,设 $f[i][j]$ 表示做完第 $i$ 题,此月做的题的区间为 $[j,i]$ 需要的最少月数 每个月记得分成还钱并写新题,和只还钱分类讨论,不要搞成每个月强制做一题 那 ...

  2. <USACO07JAN>解决问题Problem Solvingの思路

    日常为dp贡献脑细胞 #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib ...

  3. LuoguP2876 [USACO07JAN]解决问题Problem Solving (区间DP)(未完成)

    #include "Head.cpp" const int N = 307; int f[N][N], a[N], b[N], sumA[N], sumB[N]; int main ...

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

    [BZOJ1700][Usaco2007 Jan]Problem Solving 解题 Description 过去的日子里,农夫John的牛没有任何题目. 可是现在他们有题目,有很多的题目. 精确地 ...

  5. KXO151 Programming & Problem Solving

    Page 1 of 9KXO151 Programming & Problem SolvingAIEN-SOU - 2019Assignment 2Deadline for Submissio ...

  6. 学习笔记之Problem Solving with Algorithms and Data Structures using Python

    Problem Solving with Algorithms and Data Structures using Python — Problem Solving with Algorithms a ...

  7. 【BZOJ】1700: [Usaco2007 Jan]Problem Solving 解题

    [题意]给定n道题,每月末发放工资m,要求从1解到n,每道题需要在当月初付费ai,下月初付费bi,多道题可以安排在同月,求最少月数. [算法]DP [题解]参考自:[bzoj1700]Problem ...

  8. bzoj 1700 Problem Solving 解题 dp

    [Usaco2007 Jan]Problem Solving 解题 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 492  Solved: 288[Sub ...

  9. AST11103 Problem Solving

    AST11103 Problem Solving with Programming SkillsAdditional Individual Assignment: Min-Game Programmi ...

随机推荐

  1. 吴裕雄--天生自然 PHP开发学习:魔术常量

    <?php echo '这是第 " ' . __LINE__ . ' " 行'; ?> <?php echo '该文件位于 " ' . __FILE__ ...

  2. python爬取淘宝数据之遇到的问题

    1.chormedriver.exe驱动下载地址 https://npm.taobao.org/mirrors/chromedriver 2.跳转网页页面不稳定问题 添加智能等待时间 driver.i ...

  3. ZJNU 1160 - 不要62——中级

    取模判断,数组模拟 /* Written By StelaYuri */ #include<stdio.h> ]; int main(){ int n,m,i,s,t; ;i<;i+ ...

  4. springboot打包,jar包可以以service方式启动

    <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> ...

  5. MySQL笔记(一)

    MySQL是目前最流行的关系型数据库管理系统之一,它是由MySQL AB公司开发.发布并支持.MySQL是一个跨平台的开源关系型数据库管理系统,被广泛地应用在internet上的中小型网站开发中.相比 ...

  6. java常用工具类(三)

    一.连接数据库的综合类 package com.itjh.javaUtil; import java.sql.Connection; import java.sql.DriverManager; im ...

  7. 学习spring第一天

    Spring第一天笔记   1. 说在前面 怎样的架构的程序,我们认为是一个优秀的架构? 我们考虑的标准:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:就是可以做到,不断的增加代码,但是可以 ...

  8. 53)vptr指针的分布初始化

    1)一个父类: 2)一个子类: 3)我的main函数内容 4)通过结果证明 那么产生了问题,这个print是一个虚函数,不应该  在  我的main函数中   通过调用pp->print,在pr ...

  9. linux中cd / cd~ cd cd- 和cd..之间的区别

    cd        进入用户主目录  cd ~     进入用户主目录  cd -      返回进入此目录之前所在目录  cd ..     返回上一级目录  cd ../..  返回上两级目录  ...

  10. shell_backup_MySQL

    #!/bin/bash #可修改如下参数backup_filename=$(date +%Y%m%d%H%M%S)backup_tmp_dir=/data/backup/ip=10.0.1.182us ...