usaco 2002 月赛 Chores 题解
Description
Farmer John has a list of N (3 <= N <= 10,000) chores that must be completed. Each chore requires an integer time (1 <= length of time <= 100) to complete and there may be other chores that must be completed before this chore is started. We will call these
prerequisite chores. At least one chore has no prerequisite: the very first one, number 1. Farmer John's list of chores is nicely ordered, and chore K (K > 1) can have only chores 1,.K-1 as prerequisites. Write a program that reads a list of chores from 1
to N with associated times and all perquisite chores. Now calculate the shortest time it will take to complete all N chores. Of course, chores that do not depend on each other can be performed simultaneously.
Input
* Lines 2..N+1: N lines, each with several space-separated integers. Line 2 contains chore 1; line 3 contains chore 2, and so on. Each line contains the length of time to complete the chore, the number of the prerequisites, Pi, (0 <= Pi <= 100), and the Pi
prerequisites (range 1..N, of course).
Output
#include<stdio.h>
#include<cstring>
using namespace std;
const long maxn=10001;const long INF=1;
bool flag[maxn];long cnt,i,n,j,xx,time,y,h,t,go,now,ans,tong;
long dis[maxn],begin[maxn],end[maxn],x[200*maxn];
struct arr{long l,r,s,next;}a[200*maxn];
void make_up(long l,long r,long v)
{
a[++cnt].l=l;a[cnt].r=r;a[cnt].s=-v;a[cnt].next=-1;
if (begin[l]==0) {begin[l]=cnt;end[l]=cnt;}
else {a[end[l]].next=cnt;end[l]=cnt;}
}
int main()
{
//freopen("chores.in","r",stdin);freopen("chores.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++)
{
scanf("%ld",&time);
scanf("%ld",&xx);
for (j=1;j<=xx;j++)
{
scanf("%ld",&y);
make_up(y,i,time);
}
if (xx==0) make_up(0,i,time);
}
memset(flag,0,sizeof(flag));memset(dis,INF,sizeof(dis));
h=0;t=1;x[1]=0;dis[0]=0;flag[0]=true;
while (h<t)
{
now=x[++h];if (begin[now]==0) continue;i=begin[now];
while (true)
{
go=a[i].r;
if (dis[now]+a[i].s<dis[go])
{
dis[go]=dis[now]+a[i].s;
if (!flag[go])
{
flag[go]=true;
x[++t]=go;
}
}
if (a[i].next==-1) break;i=a[i].next;
}
flag[now]=false;
}
for (i=1;i<=n;i++)
if (-dis[i]>ans) ans=-dis[i];
printf("%ld",ans);
//scanf("%ld",&n);
return 0;
}
然而交了之后一直TLE,自己下了个数据,发现最后一个点大概要13s左右!想不到在稠密图里,SPFA的效率又如此之低!(边表的常数又很大)无论怎么优化都不行!
#include<stdio.h>
#include<cstring>
using namespace std;
long f[10001],n,i,j,max,ans,xx,y;
int main()
{
//freopen("chores.in","r",stdin);freopen("chores.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++)
{
scanf("%ld",&f[i]);
scanf("%ld",&xx);max=0;
for (j=1;j<=xx;j++)
{
scanf("%ld",&y);
if (f[y]>max) max=f[y];
}
f[i]+=max;
if (f[i]>ans) ans=f[i];
}
printf("%ld",ans);
//scanf("%ld",&n);
return 0;
}
然而仔细一想,我发现他们只是钻了一个数据的漏洞——刚好数据的前后关系是由小到大的。思考了很长时间,我研究出了一个更加高级的算法——记忆化深搜+边表优化!
#include<stdio.h>
#include<cstring>
using namespace std;
const long maxn=10001;const long INF=1;
long time[maxn],dp[maxn],begin[maxn],end[maxn],cnt,j,n,i,x,y,ans;
struct arr{long l,r,next;}a[200*maxn];
void make_up(long l,long r)
{
a[++cnt].l=l;a[cnt].r=r;a[cnt].next=-1;
if (begin[l]==0) {begin[l]=cnt;end[l]=cnt;}
else {a[end[l]].next=cnt;end[l]=cnt;}
}
long go(long k)
{
if (dp[k]>0) return dp[k];
long now=begin[k];
while (now>0)
{
long temp=go(a[now].r);
dp[k]=(temp>dp[k])?temp:dp[k];
now=a[now].next;
}
dp[k]+=time[k];
return dp[k];
}
int main()
{
//freopen("chores.in","r",stdin);freopen("chores.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++)
{
scanf("%ld",&time[i]);
scanf("%ld",&x);
for (j=1;j<=x;j++)
{
scanf("%ld",&y);make_up(i,y);
}
if (x==0) dp[i]=time[i];
}
for (i=1;i<=n;i++)
{
long temp=go(i);
ans=(temp>ans)?temp:ans;
}
printf("%ld",ans);
//scanf("%ld",&n);
return 0;
}
希望众神牛看到后能够留言指导!
usaco 2002 月赛 Chores 题解的更多相关文章
- usaco 2002 月赛 Fiber Communications 题解
Description Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a ...
- POJ1944 Fiber Communications (USACO 2002 February)
Fiber Communications 总时间限制: 1000ms 内存限制: 65536kB 描述 Farmer John wants to connect his N (1 <= N ...
- csu-2018年11月月赛Round2-div1题解
csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...
- csu-2018年11月月赛Round2-div2题解
csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...
- usaco 2008 月赛 lites 开关灯 题解
题目: Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是 牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一 ...
- USACO全部月赛及GateWay数据
月赛: 以07年open为例,网站如下 http://contest.usaco.org/OPEN07 其他的格式是http://contest.usaco.org/月份(月份的英文前三位,比如1月是 ...
- USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)
usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- BZOJ Lydsy5月月赛 ADG题解
题目链接 BZOJ5月月赛 题解 好弱啊QAQ只写出三题 A 判断多干个数乘积是否是某个数的倍数有很多方法,比较常用的是取模,但这里并不适用,因为模数不定 会发现数都比较小,所以我们可以考虑分解质因子 ...
随机推荐
- 双击更新所有已安装的python模块
首先声明我是一个升级控.几乎每天会查看一下手机.电脑是否有新的应用需要更新. 同样,我的python模块也是这样.百度了一下,发现目前还没有人将更新所有模块做成一件命令,但是查到了指引,主要就是两个 ...
- Tomcat 安装与配置
1. 将压缩文件“apache-tomcat-7.0.62.zip ”上传到linux系统目录:/home/下 2. 进入目录 cd /home/ 解压文件,执行如下命令:unzip apache-t ...
- Targeted Learning R Packages for Causal Inference and Machine Learning(转)
Targeted learning methods build machine-learning-based estimators of parameters defined as features ...
- 使用wamp扩展php时出现服务未启动的解决方法
今天在使用wamp扩展php的插件时,出现了如下图所示的错误提示 网上查了查,都说是端口原因,修改Apache的 80端口,但是并没有解决问题. 最后我终于找到了解决方法,步骤很简单,如下: 首先,在 ...
- [转]tomcat部署(1)
阅读目录 1 目录结构 2 部署 3 发布 4 测试 本篇参考Tomcat官方文档:<First Webapp>翻译,并结合自己的开发经验介绍关于tomcat部署以及发布的相关内容. ...
- 关于echarts使用的常见问题总结
关于echarts使用的问题总结1.legend图例不显示的问题: 在legend中的data为一个数组项,数组项通常为一个字符串,每一项需要对应一个系列的 name,如果数组项的值与name不相符则 ...
- Thrift总结(一)介绍
这段时间,一直在整理公司的内部 rpc 服务接口,面临的一个问题就是:由于公司内部的系统由几个不同的语言编写的.C# ,java,node.js 等,如何实现这些内部系统之间的接口统一调用,确实是比较 ...
- eclipse maven项目中使用tomcat插件部署项目
maven的tomcat插件部署web项目,我简单认为分两种,一种是部署到内置tomcat,另一种是部署到安装的tomcat. 第一种部署,默认是部署在内置tomcat的8080端口,如果不需要改端口 ...
- Xamarin App文件(apk)大小和启动时间的影响因素
Xamarin开发的时候大家都有一个疑问,就是apk文件会不会特别的大,启动会不会很慢.答案是肯定的,文件肯定大,启动肯定会慢,但是具体大多少.具体慢多少,有什么因素可以使apk文件稍微小一点.可以使 ...
- Canvas学习系列一:初识canvas
最近你开始在学习canvas,打算把学习canvas的整个学习过程当中的一些笔记与总结记录下来,如有什么不足之处还请大神们多多指出. 1. 认识canvas Canvas元素的出现,可以说开启的Web ...