hdu 6396 Swordsman (技巧)

大意: n个怪, m种能力值, 当自己所有能力值不低于某只怪时可以杀死它, 并获得它的所有能力, 求最大杀几只

将每只怪拆成$m$个, 排下序贪心即可, 复杂度$O(nm)$, 原题极其卡时间, 我的代码A不了, 懒得加快读了, 就这样吧

const int N = 1e6+10;
int n, k;
int a[N], p[N], num[N], val[6];
int u[N][6], v[N][6];
int id[6][N];

void work() {
	scanf("%d%d", &n, &k);
	REP(i,1,k) scanf("%d",val+i), p[i]=1;
	REP(i,1,n) num[i] = 0;
	REP(i,1,n) {
		REP(j,1,k) scanf("%d", &u[i][j]);
		REP(j,1,k) scanf("%d", &v[i][j]);
	}
	REP(i,1,k) {
		REP(j,1,n) id[i][j] = j;
		sort(id[i]+1,id[i]+1+n,[i](int a,int b){return u[a][i]<u[b][i];});
	}
	int ans = 0;
	while (1) {
		int t = ans;
		REP(i,1,k) {
			while (p[i]<=n&&u[id[i][p[i]]][i]<=val[i]) {
				int t = id[i][p[i]];
				++p[i], ++num[t];
				if (num[t]==k) {
					++ans;
					REP(j,1,k) val[j]+=v[t][j];
				}
			}
		}
		if (t==ans) break;
	}
	printf("%d\n", ans);
	REP(i,1,k) printf("%d%c", val[i], " \n"[i==k]);
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) work();
}

猜你喜欢

转载自www.cnblogs.com/uid001/p/10497855.html