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\n",ans);
        for(int i=1;i<=k;i++)
            printf("%d%c",ab[i],i==k?'\n':' ');
    }
    return 0;
}
posted @ 2018-08-19 20:50  sewage  阅读(184)  评论(0编辑  收藏  举报