• bzoj3709[PA2014]Bohater*


    bzoj3709[PA2014]Bohater

    题意:

    n只怪物,打死第i只要耗ai血,打死后补bi血。如果你血≤0就会死。你现在有z血,问怎样的顺序可以打死所有怪。n≤100000。

    题解:

    先打bi大于ai的怪攒血,此时按ai升序排序。因为先杀耗血少的再杀耗血多的,则为下一步提供了更高的可能性。因为血量是单增的,所以尽量用较少的血量去杀耗血较少的怪物。再打ai大于bi的怪,此时按bi降序排序,因为先杀补血多的再杀耗血少的,则为下一步提供了更高的可能性。当前这一步的可能性也没有减少,即使补血多的耗血很多,但是由于此时血量已经是单减的了,所以若此时无法杀掉耗血多的,将来也不能。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <queue>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define maxn 100010
     7 #define ll long long
     8 using namespace std;
     9 
    10 inline int read(){
    11     char ch=getchar(); int f=1,x=0;
    12     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    13     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    14     return f*x;
    15 }
    16 int n,sz1,sz2; ll z;
    17 struct nd{int a,b,id;}nds1[maxn],nds2[maxn];
    18 bool cmp1(nd a,nd b){return a.a<b.a;} bool cmp2(nd a,nd b){return a.b>b.b;}
    19 int main(){
    20     n=read(); z=read();
    21     inc(i,1,n){int x=read(),y=read(); if(y>=x)nds1[++sz1]=(nd){x,y,i};else nds2[++sz2]=(nd){x,y,i};}
    22     sort(nds1+1,nds1+sz1+1,cmp1); sort(nds2+1,nds2+sz2+1,cmp2);
    23     inc(i,1,sz1){
    24         if(z<=nds1[i].a){printf("NIE"); return 0;} z-=nds1[i].a; z+=nds1[i].b;
    25     }
    26     inc(i,1,sz2){
    27         if(z<=nds2[i].a){printf("NIE"); return 0;} z-=nds2[i].a; z+=nds2[i].b;
    28     }
    29     puts("TAK"); inc(i,1,sz1)printf("%d ",nds1[i].id); inc(i,1,sz2)printf("%d ",nds2[i].id); return 0;
    30 }

    20160920

  • 相关阅读:
    MVC3 验证码
    说说.NET反编译工具
    HTTP协议学习
    Spring Web Flow 的优缺点
    Java CLASSPATH 引发的问题
    MySQL 高级
    Java Policy
    AJAX
    数据结构与算法学习资源
    C#学习资源
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5890517.html
Copyright © 2020-2023  润新知