当前位置: 代码迷 >> 综合 >> hdu多校第七场题解(=100人)
  详细解决方案

hdu多校第七场题解(=100人)

热度:93   发布时间:2023-10-21 05:54:56.0

K - Swordsman
这题挺好的,做的时候写了假算法,而且没用fread读入,结果sort一下就T了。。
还以为思路错了。。
实际上思路很裸,将怪兽按k个a值排个序,然后k个指针往后走,如果一个怪兽被扫了k次,那么能力值就加上这个怪兽的b。
呜呜呜。。
这里刚好贴一下输入挂

#include<bits/stdc++.h>
using namespace std;
// fread读入挂
const int maxn=1e5+5;
namespace IO {const int MX = 4e7; //1e7占用内存11000kbchar buf[MX]; int c, sz;void begin() {c = 0;sz = fread(buf, 1, MX, stdin);}inline bool read(int &t) {while(c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++;if(c >= sz) return false;bool flag = 0; if(buf[c] == '-') flag = 1, c++;for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0';if(flag) t = -t;return true;}
}
int v[10];
struct node
{int a[10],b[10];
}P[maxn];
int f[10][maxn];
int n,k;bool cmp1(int x,int y)
{return P[x].a[1]<P[y].a[1];
}
bool cmp2(int x,int y)
{return P[x].a[2]<P[y].a[2];
}
bool cmp3(int x,int y)
{return P[x].a[3]<P[y].a[3];
}
bool cmp4(int x,int y)
{return P[x].a[4]<P[y].a[4];
}
bool cmp5(int x,int y)
{return P[x].a[5]<P[y].a[5];
}
void Sort()
{if(k>=1)sort(f[1]+1,f[1]+1+n,cmp1);if(k>=2)sort(f[2]+1,f[2]+1+n,cmp2);if(k>=3)sort(f[3]+1,f[3]+1+n,cmp3);if(k>=4)sort(f[4]+1,f[4]+1+n,cmp4);if(k>=5)sort(f[5]+1,f[5]+1+n,cmp5);
}
int go[10];
int cnt[maxn];
void solve()
{memset(cnt,0,sizeof(cnt));for(int i=1;i<=k;i++)go[i]=1;/*for(int i=1;i<=k;i++){for(int j=1;j<=n;j++)cout<<f[i][j]<<' ';cout<<endl;}*/int sum=0;while(1){int res=0;for(int i=1;i<=k;i++){if(go[i]<=n){int idx=f[i][go[i]];if(v[i]>=P[idx].a[i]){go[i]++;cnt[idx]++;if(cnt[idx]>=k){for(int j=1;j<=k;j++)v[j]+=P[idx].b[j];sum++;}res++;}}}if(!res)break;}printf("%d\n",sum);for(int i=1;i<=k;i++){if(i!=1)printf(" ");printf("%d",v[i]);}puts("");
}
using namespace IO;
int main()
{int T;IO::begin();read(T);while(T--){read(n);read(k);for(int i=1;i<=k;i++)read(v[i]);for(int i=1;i<=n;i++){for(int j=1;j<=k;j++)read(P[i].a[j]);for(int j=1;j<=k;j++)read(P[i].b[j]),f[j][i]=i;}Sort();solve();}}