http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=808&pid=1011
题意:一开始你有k种魔法能力,每种能力是vi。每个怪物有k种防御力,如果你的每一种能力都大于其相应的ai,就可以干掉他,并且所有的能力都可以获得一个提升bi。
注意:题目要求使用输入挂
分析:
对于怪物按照每一个能力排一个序,然后维护当前每一种能力能干掉的怪物。如果k个容器里都有某个怪物,那么这个怪物就可以被干掉了,继续贪心。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define LL long long
using namespace std;
const LL N = 1e5+33;
int vis[N];
struct node
{
int val;
int id;
bool friend operator < (node a,node b)
{
return a.val<b.val;
}
}a[6][N];
int b[6][N];
int v[6];
int n,k;
void kill(int x)
{
for(int i=1;i<=k;i++)
v[i]+=b[i][x];
}
#define FI(n) FastIO::read(n)
namespace FastIO {
const int SIZE = 1 << 16;
char buf[SIZE], obuf[SIZE], str[60];
int bi = SIZE, bn = SIZE, opt;
int read(char *s) {
while (bn) {
for (; bi < bn && buf[bi] <= ' '; bi++);
if (bi < bn) break;
bn = fread(buf, 1, SIZE, stdin);
bi = 0;
}
int sn = 0;
while (bn) {
for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi];
if (bi < bn) break;
bn = fread(buf, 1, SIZE, stdin);
bi = 0;
}
s[sn] = 0;
return sn;
}
bool read(int& x) {
int n = read(str), bf;
if (!n) return 0;
int i = 0; if (str[i] == '-') bf = -1, i++; else bf = 1;
for (x = 0; i < n; i++) x = x * 10 + str[i] - '0';
if (bf < 0) x = -x;
return 1;
}
};
int main()
{
int T;
FI(T);
while(T--){
FI(n);FI(k);
for(int i=1;i<=k;i++){
FI(v[i]);
}
for(int i=1;i<=n;i++){
vis[i]=0;
for(int j=1;j<=k;j++){
FI(a[j][i].val);
a[j][i].id=i;
}
for(int j=1;j<=k;j++){
FI(b[j][i]);
}
}
for(int i=1;i<=k;i++){
sort(a[i]+1,a[i]+1+n);
}
int cnt[6];
for(int i=1;i<=k;i++) cnt[i]=1;
int sum=0;
while(1)
{
int flag=0;
for(int i=1;i<=k;i++){
while(cnt[i]<=n&&a[i][cnt[i]].val<=v[i]){
int to=a[i][cnt[i]].id;
vis[to]++;
if(vis[to]==k){
flag=1;
sum++;
kill(to);
}
cnt[i]++;
}
}
if(!flag)
break;
}
printf("%d\n",sum);
for(int i=1;i<=k;i++){
printf("%d%c",v[i],i==k?'\n':' ');
}
}
return 0;
}