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;//保存数据的地方
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;
}
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;
}
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用