贪心与传球

来源:互联网 发布:罗马斗兽场 知乎 编辑:程序博客网 时间:2024/06/05 19:55

对等待时间贪心,很显然想要愤怒值少,等待时间短的先弄最优

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int n;struct st{    int t,d;}a[199999];int cmp(const st & a,const st &b){    if(a.d<b.d||a.d==b.d&&a.t<b.t)    return 1;    return 0;}int check(){    int t=0,ans=0;    for(int i=1;i<=n;i++){        t+=a[i].t;        if(t>a[i].d) ans=max(ans,t-a[i].d);    }    return ans;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%d",&a[i].t);    for(int i=1;i<=n;i++) scanf("%d",&a[i].d);    sort(a+1,a+n+1,cmp);        int w=check();    printf("%d",w);}

先把不在环上的找出来,肯定是以入读为零的为起点这样最长,处理出所有临近环的距离,然后找出环,去掉一条边,接上邻近的距离,求最大值。

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int Maxn=500001;int n;int a[Maxn],d[Maxn],ru[Maxn],c[Maxn],cnt;int h[Maxn],f[Maxn],ans,pre[Maxn];int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d%d",&a[i],&d[i]);          ru[a[i]]++;    }    for(int i=1;i<=n;i++)    if(ru[i]==0) c[++cnt]=i;    for(int i=1;i<=cnt;i++)    {        f[a[c[i]]]=max(f[a[c[i]]],f[c[i]]+d[c[i]]);        ru[a[c[i]]]--;        if(!ru[a[c[i]]]) c[++cnt]=a[c[i]];    }    for(int i=1;i<=n;i++)    if(ru[i]){        int s=d[i];        int tot=1;        h[1]=i;pre[a[i]]=i;        for(int k=a[i];k!=i;k=a[k]){            h[++tot]=k;            pre[a[k]]=k;            s+=d[k];        }        for(int k=1;k<=tot;k++){            ans=max(ans,s-pre[k]+f[k]);        }    }    printf("%d",ans);}