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

版权声明:转载之前请说你是博主的粉丝哦。 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();
    }


}

猜你喜欢

转载自blog.csdn.net/qq_34921856/article/details/82195076