• 2018杭电多校第七场1011(优先队列【结构体排序】,思维)


    #include<bits/stdc++.h>
    using namespace std;
    int ab[10];
    struct node
    {
        int hp,num;//num为了方便跟踪每一个hp值
        bool operator < (const node &x)const
    {
        return hp>x.hp;//按照血量降序排列
    }
    }tmp;
    struct guaishou
    {
        int hp[10],ad[10],num;//保存数据的地方
    }gs[100010];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int sum=0;
            int n,k;
            scanf("%d%d",&n,&k);
            for(int i=1;i<=k;i++)
            {
                scanf("%d",&ab[i]);
            }
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=k;j++)
                {
                    scanf("%d",&gs[i].hp[j]);
                }
                for(int j=1;j<=k;j++)
                {
                    scanf("%d",&gs[i].ad[j]);
                }
                gs[i].num=i;
            }
            priority_queue<node>q[10];
            for(int i=1;i<=n;i++)
            {
                q[1].push({gs[i].hp[1],i});//第一个数据放入队列
            }
            int ans=0;
            while(1){
            for(int i=1;i<k;i++)//每一个hp都要大于等于才可以击杀
            {
                while(!q[i].empty())
                {
                    tmp=q[i].top();
                    if(tmp.hp<=ab[i])
                    {
                        int flag=tmp.num;
                        q[i+1].push({gs[flag].hp[i+1],flag});//把这一个条件满足的hp放入下一个队列中再次筛选
                        q[i].pop();
                    }
                    else
                        break;//剩余的这一次击杀不了
                }
            }
            while(!q[k].empty())
            {
                tmp=q[k].top();
                if(tmp.hp<=ab[k])
                {
                    sum++;//可以击杀
                    int flag=tmp.num;
                    for(int i=1;i<=k;i++)
                        ab[i]+=gs[flag].ad[i];
                    q[k].pop();
                }
                else
                    break;
            }
            if(ans==sum)
                break;//用来判重(与上一次循环时相同)
            ans=sum;
            }
            printf("%d ",ans);
            for(int i=1;i<=k;i++)
                printf("%d%c",ab[i],i==k?' ':' ');
        }
        return 0;
    }
    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    PHP计算两个绝对路径的相对路径
    mysql触发器的使用 想让b字段在更新的时候把旧数据保存到a字段中
    LHC大神问的矩阵转置问题
    母牛2年生小牛 5年后并死去的算法
    switch和continue的关系
    逐行读取文件示例
    安装Harbor管理镜像服务
    解决:ElasticSearch ClusterBlockException[blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
    Jenkins教程(五)构建Java服务Docker镜像
    Nacos高可用集群解决方案-Docker版本
  • 原文地址:https://www.cnblogs.com/ldudxy/p/9502563.html
Copyright © 2020-2023  润新知