牛客多校第六场

D 题意感觉说的不是很清楚,一开始题意弄错了,以为是最优的方案,结果是对于每个盒子这个"so clever"的人的做法是优先选择尽可能大的物品装完一个盒子,我就不知道这个人哪里聪明了。。

思路:赛后知道题意后,5分钟写完,瞎暴力就一发过了,我自己都有点出乎意料真水了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int v[maxn];
int vis[maxn];
int temp[maxn];
int n,m;
int cmp(int a,int b)
{
    return a>b;
}
int check(int x)
{
    memset(vis,0,sizeof(vis));
    for(int i=1; i<=n; i++)
        temp[i]=v[i];
    sort(temp+1,temp+1+n,cmp);
    if(temp[1]>x)
        return 0;
    int cnt=0;
    for(int i=1; i<=n; i++)
    {
        if(vis[i]==0)
        {
            int cha=x-temp[i];
            cnt++;
            vis[i]=1;
            for(int j=i+1; j<=n; j++)
            {
                if(temp[j]<=cha&&vis[j]==0)
                {
                    cha-=temp[j];
                    vis[j]=1;
                }
            }
        }
    }
    if(cnt<=m) return 1;
    else return 0;
}
int main()
{

    int t;
    scanf("%d",&t);
    for(int it=1; it<=t; it++)
    {
        scanf("%d%d",&n,&m);
        int sum=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&v[i]);
            sum+=v[i];
        }
        int l=sum/m;
        for(int i=l;; i++)
        {
            if(check(i))
            {
                printf("Case #%d: %d
",it,i);
                break;
            }
        }
    }

}
View Code

J 这个题也水的一比,我队友还说用DP,可是思考一下明显不需要嘛,不过一开始一个变量赋值出错,还有下标没有从0开始忽略了等级为0的情况,疯狂罚时,有点不爽。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
#define ll long long
ll sum[maxn][maxn];
ll per[maxn][maxn];
int val[maxn][maxn];
ll d[maxn];
int pos[maxn][maxn];
int main()
{
    int t;
    scanf("%d",&t);
    for(int it=1; it<=t; it++)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
            {
                int t;
                scanf("%d",&t);
                val[i][j]=t;
            }
        for(int i=1; i<=m; i++)
        {
            scanf("%lld",&d[i]);
            d[i]+=d[i-1];
        }
        for(int j=1; j<=m; j++)
            for(int i=1; i<=n; i++)
            {
                per[i][j]=per[i][j-1]+val[i][j];
            }
        for(int i=1; i<=n; i++)
        {
            ll minn=per[i][m];
            int p=m;
            for(int j=m; j>=0; j--)
            {
                if(minn>=per[i][j])
                {
                    minn=per[i][j];
                    p=j;
                }
                sum[i][j]=minn;
                pos[i][j]=p;
            }
        }
//      for(int i=1;i<=n;i++)
//      {
//          for(int j=1;j<=m;j++)
//              printf("%d ",sum[i][j]);
//          printf("
");
//      }
        ll ans=0;
        for(int j=0; j<=m; j++)
        {
            ll s=0;
            int pmin=0x3f3f3f3f;
            for(int i=1; i<=n; i++)
            {
                s+=sum[i][j];
                pmin=min(pmin,pos[i][j]);
            }
//          printf("%d %d??
",pmin,s);
            if(pmin!=j)
            {
                ll t=1e18;
                for(int i=1; i<=n; i++)
                    t=min(t,-sum[i][j]+per[i][j]);
                s+=t;
            }
//          printf("%d %d")
            s=d[j]-s;
//          printf("%d %d
",j,s);
            ans=max(ans,s);
        }
        printf("Case #%d: %lld
",it,ans);
    }
}
View Code
原文地址:https://www.cnblogs.com/dongdong25800/p/11295795.html