洛谷P3074牛奶调度解题报告

xiaoxiao2021-02-27  256

这题其实是真的简单,但是有些细节要注意 大概就是每一头牛都开个数组存它之前必须要挤奶的牛,再定义一个更新数组,然后走一遍O(n)的循环,每次去找前面的牛是否更新,没有更新就更新再将更新数组标1,已经全部更新了就找其中所需时间最长的加上自己的时间,然后再将自己标为已更新,最后再走一遍循环找最大的时间就可以了(ps:如果一头牛更新两次的话,超时不说,而且每次数值也会变掉,必定WA) AC代码:

#include<iostream> #include<cstdio> using namespace std; int chu[10005][10005]/*存父牛*/,t[10005],cen=0,gg[10005],n,m,gen[10005] int milk(int u)//更新 { int ans=0; if(!chu[u]) return t[u]; else for(int i=1;i<=chu[u][0];i++) { if(!gen[chu[u][i]])//如果没有更新就更新 { gen[chu[u][i]]=1; t[chu[u][i]]=milk(chu[u][i]); } ans=max(ans,t[chu[u][i]]); } t[u]+=ans; gen[u]=1;//标为已更新 return t[u]; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>t[i]; for(int i=1;i<=m;i++) { int a,b; cin>>b>>a; chu[a][0]++; chu[a][chu[a][0]]=b;//存之前的牛 } for(int i=1;i<=n;i++) { if(!gen[i])//如果已经更新就不需要更新了,不然会WA milk(i); } for(int i=1;i<=n;i++) { cen=max(cen,t[i]); } cout<<cen<<endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-11032.html

最新回复(0)