zoukankan      html  css  js  c++  java
  • 【CF1257D】Yet Another Monster Killing Problem【贪心】

    题意:给定一些怪物,每天可以选一个勇士进去打怪,每个勇士每天只能打不超过si个怪物,每个勇士只能打能力值≤pi的怪物,问最少多少天打完所有怪物

    题解:贪心,每天尽可能多的去打怪,那么存一个对于长度为i的怪物可以用的最大的能力值是多少,每天枚举长度,尽可能长的去打怪即可

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cmath>
    #define ll long long
    using namespace std;
    int T,n,m,ans;
    int a[200001],mx[200001];
    struct node
    {
        int p,s;
    }b[200001];
    bool cmp(const node &T1,const node &T2){return T1.s>T2.s;}
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
          for(int i=1;i<=n;i++)mx[i]=0;
          scanf("%d",&n);
          for(int i=1;i<=n;i++)scanf("%d",&a[i]);
          scanf("%d",&m);
          for(int i=1;i<=m;i++)scanf("%d%d",&b[i].p,&b[i].s);
          sort(b+1,b+1+m,cmp);
          int j=1,t=0;
          for(int i=n;i>0;i--)
          {
            while(j<=m && b[j].s>=i)
            {
              t=max(t,b[j].p);
              j++;
            }
            mx[i]=t;
          }
          ans=0;j=1;t=0;
          for(int i=1;i<=n;i++)
          {
            t=max(t,a[i]);
            if(t>mx[j])
            {
              //printf("%d %d %d %d
    ",i,j,a[i],mx[j]);
              if(j==1){ans=-1;break;}
              ans++;j=1;i--;t=0;
            }
            else j++;
          }
          if(ans>-1)ans++;
          //for(int i=1;i<=n;i++)printf("%d ",mx[i]);
          printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    Go源码文件与命令
    K8s控制器
    odoo 在form视图sheet右上角增加按钮
    odoo 常用widget
    odoo tree视图中实现横向滚动条
    可能是智障的高二生活
    千题计划
    闲谈
    线性代数与simplex
    好题集锦
  • 原文地址:https://www.cnblogs.com/worcher/p/11865158.html
Copyright © 2011-2022 走看看