2018 Multi-University Training Contest 7 1011 Swordsman【貪心+輸入掛】
阿新 • • 發佈:2018-12-24
題意:一開始你有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;
}