• P4712 「生物」能量流动


    由于题面$markdown$格式,博主太懒不想一个一个改,所以题面见此:

    Solution:

      本题的贪心思路比较有意思,完全考读题。。。

      首先,因为总的能量来源是$a[0]$,所以可以理解为总能量守恒(不计损失),又$r[i]leq r[i+1]$,所以满足第$i+1$只动物需求的前提是必须先满足第$i$只动物需求,那么我们就可以根据题意模拟了。

      从前往后扫一遍,到了第$i$只动物时,假设前$r[i]$只满足需求,直接累加前$r[i]$只的总能量(由于$r[i]$单调不下降,所以用一个指针$p$不停后移就好了),若不满足当前第$i$只动物的需求,直接输出$-1$,否则就减去消耗,继续模拟。

      最后输出的就是当前所剩的总能量的$frac{1}{5}$就好了。

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)>(b)?(b):(a))
    using namespace std;
    ll n,a[100005],r[100005];
    double w[100005];
    
    il int gi(){
        int a=0;char x=getchar();bool f=0;
        while((x<'0'||x>'9')&&x!='-')x=getchar();
        if(x=='-')x=getchar(),f=1;
        while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar();
        return f?-a:a;
    }
    
    int main(){
        n=gi(),w[0]=gi();
        int u,v,c;
        For(i,1,n) w[i]=gi(),r[i]=gi();
        int p=0;
        For(i,1,n){
            while(p+1<=r[i])p++,w[0]+=w[p];
            w[0]-=w[i]*5;
            if(w[0]<0){printf("-1");return 0;}
        }
        while(p+1<=n)p++,w[0]+=w[p];
        printf("%.8lf",w[0]/5);
        return 0;
    }
  • 相关阅读:
    web安全之ssrf
    web安全之sql注入布尔注入
    web安全之sql注入报错型注入
    web安全之sqlload_file()和into outfile()
    浅谈 FHQ-Treap
    (菜鸟都能看懂的)网络最大流最小割,Ford-Fulkerson及Dinic详解
    浅谈最小生成树
    浅谈强连通分量(Tarjan)
    DP-DAY3游记
    关于01背包问题
  • 原文地址:https://www.cnblogs.com/five20/p/9198229.html
Copyright © 2020-2023  润新知