题意:
给一个人的k个属性,,然后给n只怪的k个属性,当主角所有属性高于怪的时候能将怪的属性吞噬并杀死
求主角能杀多少只怪并且属性最高到多少
思路:
因为题目的属性最多为五,用一个一维优先队列,队列里面放怪的单个属性进行排序,这里我们需要用到pair绑定属性和怪的id,优先队列里面我们可以直接判断能打死的怪,遍历k遍之后,如果有怪被打了k次,说明所有属性均高于怪,这时候就能把怪吞噬了,如果有怪被吞噬,那么主角又可以去找之前打不过的怪来砍,当主角砍不死任何一只怪的时候,就表示主角已经满级了
注意:因为题目输入比较大,所以会被输入卡时间,这里需要用到IO输入挂才能过。因为是文件输入,所以自己测试的时候需要自己输入一下
cin.tie(0);
cout.tie(0);
这两个在这里并没有用到,用这个可以提升cin和cout的输入输出速度
代码:
#include<bits/stdc++.h>
#define P pair<int,int>
using namespace std;
P zz;
namespace IO {
const int MX = 4e7; //1e7 占用内存 11000kb
char buf[MX];
int c, sz;
void begin() {
c = 0;
sz = fread(buf, 1, MX, stdin);//一次性全部读入
}
inline bool read(int &t) {
while (c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++;
if (c >= sz) return false;//若读完整个缓冲块则退出
bool flag = 0;
if(buf[c] == '-') flag = 1, c++;
for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0';
if(flag) t = -t;
return true;
}
}
priority_queue<P,vector<P>,greater<P> >a[6];
int man[6];
int rankup[100005][6];
int boold[100005];
int main() {
cin.tie(0);
cout.tie(0);
int t;
IO::begin();
IO::read(t);
// scanf("%d",&t);
while(t--) {
int n,k;
memset(boold,0,sizeof(boold));
IO::read(n);
IO::read(k);
// scanf("%d %d",&n,&k);
for(int i=1; i<=k; i++) {
IO::read(man[i]);
// scanf("%d",&man[i]);
}
for(int i=1; i<=k; i++) {
while(!a[i].empty()) {
a[i].pop();
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=k; j++) {
int x;
// scanf("%d",&x);
IO::read(x);
zz.first=x;
zz.second=i;
a[j].push(zz);
}
for(int j=1; j<=k; j++) {
IO::read(rankup[i][j]);
// scanf("%d",&rankup[i][j]);
}
}
int ans=0;
int mark;
while(1){
mark=0;
for(int i=1;i<=k;i++){
while(!a[i].empty()){
zz=a[i].top();
if(zz.first<=man[i]){
a[i].pop();
boold[zz.second]++;
if(boold[zz.second]==k){
for(int j=1;j<=k;j++){
man[j]+=rankup[zz.second][j];
}
ans++;
mark=1;
}
}
else{
break;
}
}
}
if(!mark)
break;
}
cout<<ans<<endl;
for(int i=1; i<=k; i++) {
if(i!=1) {
cout<<" ";
}
cout<<man[i];
}
puts("");
}
}