题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2701
题意:有N条通路以及M个人,每条通路每次仅能通过w个人,每一组人通过需要花费时间t,且需要满足2个条件
1.每次只能有一组人进入一条通路
2.当通路入口有人且通路为空则必须进入
思路:题目很长……刚开始题目都没有读懂,以为是网络流什么的,后来听了别人讲解,感觉直接暴力就可以做,但是写起来觉得并不是那么容易,又跑去参考了别人的代码,发现用的是类似dp的思想进行暴力,我个人感觉还是相当巧妙的,dp[i][tim]中i表示当前进行处理的第i条通路,tim则是时间,保存该通路路口有多少个人,res保存的是所有人从i-1条通路离开的时间,当tim>res时则表示所有人已经从i-1通路离开,且dp[i][tim]=0,所有人也从第i条通路通过,就可以进行下一条通路的处理,q保存的是当前通路中的人离开通路的时间,q=0时进行状态的转移
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int wei[230],cost[230],dp[230][40030];
int main()
{
int n,m,res,q;
while (scanf("%d%d",&n,&m)!=EOF )
{
if (!n && !m) break;
n=-n;
memset(dp,0,sizeof(dp));
for (int i=0;i<n;i++)
{
scanf("%d%d",&wei[i],&cost[i]);
}
dp[0][0]=m;
res=0;
q=0;
for (int i=0;i<n;i++)
{
int tim=0;//cout<<i<<":"<<tim<<endl;
while(true)
{
if (tim!=0) dp[i][tim]+=dp[i][tim-1];
if (dp[i][tim]==0 && tim>res) break;
if (q!=0) q--;
else if (dp[i][tim]!=0)
{
dp[i+1][tim+cost[i]]+=min(dp[i][tim],wei[i]);
dp[i][tim]-=min(dp[i][tim],wei[i]);
q=cost[i]-1;
res=max(tim+cost[i],res);
}
tim++;
}
}
printf("%d\n",res);
}
}
、