BZOJ1700: [Usaco2007 Jan]Problem Solving 解题
2024-08-30 14:21:36
每月m<=1000块钱,有n<=300道题,要按顺序做,每月做题要花钱,花钱要第一个月预付下个月立即再付一次,给出预付和再付求最少几个月做完题,第一个月不做。
神奇的DP。。竟没想出来。。
注意到这个月做题受制于上个月做的题,f[i][j]--最后做i~j题的最少月数,f[i][j]=inf(i~j不能在一个月内做完)min(f[k][i-1]+2)(做k~i-1题后再付后不能在该月立即做i~j)min(f[k]i-1]+1)(k~i-1题后再付后可立即做i~j)
括号里的判断用前缀和即可。注意判断能不能一个月做完要考虑再付!!
感谢数据http://blog.sina.com.cn/s/blog_8d5d2f0401017kfk.html
#include<stdio.h>
#include<string.h>
#include<algorithm>
//#include<iostream>
using namespace std; int n,m;
#define maxn 311
int f[maxn][maxn],a[maxn],b[maxn],sa[maxn],sb[maxn];
const int inf=0x3f3f3f3f;
int main()
{
scanf("%d%d",&m,&n);sa[]=sb[]=;
for (int i=;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
sa[i]=sa[i-]+a[i];
sb[i]=sb[i-]+b[i];
}
for (int i=;i<=n;i++) if (sa[i]<=m && sb[i]<=m) f[][i]=;else f[][i]=inf;
for (int j=;j<=n;j++)
for (int i=;i<=j;i++)
{
f[i][j]=inf;int tmp=sa[j]-sa[i-];
if (tmp<=m && sb[j]-sb[i-]<=m) for (int k=;k<i;k++)
{
if (sb[i-]-sb[k-]+tmp>m)
f[i][j]=min(f[i][j],f[k][i-]+);
else f[i][j]=min(f[i][j],f[k][i-]+);
}
}
int ans=inf;
for (int i=;i<=n;i++) ans=min(ans,f[i][n]);
printf("%d\n",ans);
return ;
}
最新文章
- 体验VS2015 Update 2 的 Android 和 Python
- Tomcat启动服务报错:Unknown version string [3.1]. Default version will be used.
- iOS Debug日志 viewhierarchy调试笔记
- pooling方法修改方案
- svn出现权限不足时的解决方法
- scrapy 模拟登录后再抓取
- HTML5分析实战WebSockets一个简短的引论
- 再叙Java反射
- HDU - 2612 bfs [kuangbin带你飞]专题一
- linux监控系统的状态
- SpringBoot项目部署到服务器上,tomcat不启动该项目
- HAProxy 实现 mysql 负载均衡
- CentOS 7Google浏览器
- maven私库nexus2.3.0-04迁移升级到nexus-3.16.1-02(异机迁移备份)
- xpath 中 [<;Element a at 3985984dj343>;]
- linux 防火墙 ufw使用
- Knowing is not enough; we must apply. Willing is not enough; we must do.
- 小程序用户openid设置放缓存
- centos7+hadoop完全分布式集群搭建
- Python3 异常: name &#39;basestring&#39; is not defined