版权声明:转载之前请说你是博主的粉丝哦。 https://blog.csdn.net/qq_34921856/article/details/82195076
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占用内存11000kb
char 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();
}
}