• 【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;
    }
  • 相关阅读:
    延迟任务的实现方式
    brpc的安装20220620可用
    tmux和zsh的个性化配置针对无法连接外网的机器
    VimForCpp离线安装
    记录一个vim配置
    LeetCode No1051. 高度检查器
    LeetCode No890. 查找和替换模式
    LeetCode No63. 不同路径 II
    LeetCode No64. 最小路径和
    个人资料
  • 原文地址:https://www.cnblogs.com/worcher/p/11865158.html
Copyright © 2020-2023  润新知