1. 程式人生 > >2018 Multi-University Training Contest 7 1011 Swordsman【貪心+輸入掛】

2018 Multi-University Training Contest 7 1011 Swordsman【貪心+輸入掛】

題意:一開始你有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; }