SwordsmanTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 635 Accepted Submission(s): 177 Problem Description Lawson is a magic swordsman with k kinds of magic attributes v1,v2,v3,…,vk . Now Lawson is faced with n monsters and the i -th monster also has k kinds of defensive attributes ai,1,ai,2,ai,3,…,ai,k . If v1≥ai,1 and v2≥ai,2 and v3≥ai,3 and … and vk≥ai,k , Lawson can kill the i -th monster (each monster can be killed for at most one time) and get EXP from the battle, which means vj will increase bi,j for j=1,2,3,…,k . Input There are multiple test cases. The first line of input contains an integer T , indicating the number of test cases. For each test case: Output For each test case: Sample Input 1 4 3 7 1 1 5 5 2 6 3 1 24 1 1 1 2 1 0 4 1 5 1 1 6 0 1 5 3 1 Sample Output 3 23 8 4 Hint For the sample, initial V = [7, 1, 1] ① kill monster #4 (6, 0, 1), V + [5, 3, 1] = [12, 4, 2] ② kill monster #3 (0, 4, 1), V + [5, 1, 1] = [17, 5, 3] ③ kill monster #1 (5, 5, 2), V + [6, 3, 1] = [23, 8, 4] After three battles, Lawson are still not able to kill monster #2 (24, 1, 1) because 23 < 24. |
题意:
你有一把有k种属性的剑,分别告诉你属性值,有n个小怪兽,每个怪兽对应的各有一个属性值,如果你的剑的每个属性值都大于等于怪兽相应的值,那么你可以杀死它并且在不减少自身属性值的前提下分别获得各个属性值的加成,问你最多能大多少怪,每个属性值最多是多少
做法:
很明显是一道水题的样子(好像好像好像是水题)。。被各种卡时间。。心里苦。。大概做法就是开相应个数的优先队列,先把所有的放进第一个队列里,符合条件后放入下一个,在最后一个队列里进行处理,如果也满足条件的话就把相应的属性值加上去,直到没有进行改变位置。因为每个怪兽最多进队k次出队k次,所以时间复杂度是O(kn logn)的
不知道为什么快速读入还是T了,标程的快速读入在cb里运行不了。。但是交上去还是A了。。所以留个板子以备不时之需。。
代码如下:
#include<bits/stdc++.h>
using namespace std;
namespace fastIO {
#define BUF_SIZE 100000
//fread -> read
bool IOerror = 0;
inline char nc() {
static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
if(p1 == pend) {
p1 = buf;
pend = buf + fread(buf, 1, BUF_SIZE, stdin);
if(pend == p1) {
IOerror = 1;
return -1;
}
}
return *p1++;
}
inline bool blank(char ch) {
return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
inline void read(int &x) {
char ch;
while(blank(ch = nc()));
if(IOerror) return;
for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');
}
#undef BUF_SIZE
};
using namespace fastIO;
typedef pair<int,int> pii;
typedef priority_queue<pii, vector<pii> ,greater<pii > > Q;
const int maxn=200005;
Q q[15];
int n,k,defe[maxn][15],add[maxn][15],man[15];
int main(){
int t;
read(t);
while(t--){
read(n); read(k);
for(int i=1;i<=k;i++){
read(man[i]);
q[i]=Q();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++)
read(defe[i][j]);
q[1].push({defe[i][1],i});
for(int j=1;j<=k;j++)
read(add[i][j]);
}
int flag=1,ans=0;
while(flag){
flag=0;
for(int i=1;i<k;i++){
while(!q[i].empty()&&q[i].top().first<=man[i]){
int id=q[i].top().second;
q[i+1].push({defe[id][i+1],id});
q[i].pop();
}
}
while(!q[k].empty()&&man[k]>=q[k].top().first){
int id=q[k].top().second;
ans++;
flag=1;
for(int i=1;i<=k;i++){
man[i]+=add[id][i];
}
q[k].pop();
}
}
printf("%d\n",ans);
for(int i=1;i<=k;i++)
printf("%d%c",man[i],i==k?'\n':' ');
}
return 0;
}