• D


    题目连接:

    https://codeforces.com/contest/1257/problem/D

    题目大意:

    n个怪兽,m个英雄,每个怪兽有一定的能力值,每个英雄有一定的能力值和一定的耐力值。耐力值得含义是每天可以击杀怪兽的最多数目。当英雄的能力值大于怪兽的能力值时,英雄可以击杀怪兽,然后问击杀

    所有的怪兽所需要的最短时间,如果不能击杀所有怪兽,输出-1;

    思路:主要是一个对一个mx数组的理解mx[i]的含义是在耐力值为i的情况下,英雄的最大能力。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2E5+7;
    int arr[N];
    int mx[N];
    int p[N],abi[N];
    void solve(){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) mx[i]=0;
        for(int i=1;i<=n;i++)   scanf("%d",&arr[i]);
        int m;
        scanf("%d",&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&abi[i],&p[i]);
            mx[p[i]]=max(mx[p[i]],abi[i]);
        }
        //一天可以击杀i个的英雄一定可以击杀i-1个。
        //即mx[i]指的是耐力值大于等于i的英雄的最大能力。
        for(int i=n-1;i>=1;i--) mx[i]=max(mx[i],mx[i+1]);
        int day=0,j=1;
        bool flag=false;
        for(int i=1;i<=n;){
            day++;
            flag=false ;
            int maxn=0;
            int tmp=i;
            //一天可以击杀的最大数量,找到这几个怪兽的最大能力,然后在mx数组中查找击杀x个怪兽英雄的最大能力。
            while(1){
                maxn=max(arr[i],maxn);
                if(maxn>mx[i-tmp+1]) break;
                i++;
                flag=true;
            }
            if(!flag) break;
        }
        if(!flag) day=-1;
        printf("%d
    ",day);
        return ;
    }
    
    int main(){
        cin.tie(0);
        int t;
        scanf("%d",&t);
        while(t--) solve();
        return 0;
    }
  • 相关阅读:
    shell——变量
    xxx is not in the sudoers file.This incident will be reported.的解决方法
    百度面试回忆
    iOS网络协议 HTTP/TCP/IP浅析
    使用xib封装一个自定义view的步骤
    修改了系统自带头文件后,Xcode会报错
    字典转模型规范化
    文本属性Attributes
    苹果API常用英语名词
    命令行 -- 命令"%cd%"
  • 原文地址:https://www.cnblogs.com/Accepting/p/11911605.html
Copyright © 2020-2023  润新知