hdu 6396 Swordsman (技巧)
生活随笔
收集整理的這篇文章主要介紹了
hdu 6396 Swordsman (技巧)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
大意: n個(gè)怪, m種能力值, 當(dāng)自己所有能力值不低于某只怪時(shí)可以殺死它, 并獲得它的所有能力, 求最大殺幾只
?
?
將每只怪拆成$m$個(gè), 排下序貪心即可, 復(fù)雜度$O(nm)$, 原題極其卡時(shí)間, 我的代碼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(); }?
轉(zhuǎn)載于:https://www.cnblogs.com/uid001/p/10497855.html
總結(jié)
以上是生活随笔為你收集整理的hdu 6396 Swordsman (技巧)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python并发编程之:多进程
- 下一篇: java的this关键字理解