贪心与传球

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

#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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值