CF1574D The Strongest Build

【题意】

给定n行数,每行$c_i$个,保证$a_{i,j}<a_{i,j+1}$,现在让你每行选出第$b_i$个元素,这种选择方案记为${b_1,b_2,...,b_n}$,给定m个不能选择的方案,问剩下的方案中和最大为多少

【分析】

先全选最大看合不合法,如果不行给m个依次替换一位找到合法的当中最大的即可

复杂度$O(nmlogm)$

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector <vector<int> > a,b; 
int n,m;
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    scanf("%d",&n);
    a.resize(n);
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%d",&x); a[i].resize(x);
        for(int j=0;j<x;j++) scanf("%d",&a[i][j]);
    }
    scanf("%d",&m);
    b.resize(m);
    for(int i=0;i<m;i++)
    {
        b[i].resize(n);
        for(int j=0;j<n;j++)
        {
            scanf("%d",&b[i][j]);
            b[i][j]--;
        }
    }
    sort(b.begin(),b.end());
    vector <int> fin(n);
    for(int i=0;i<n;i++) fin[i]=int(a[i].size())-1;
    if(!binary_search(b.begin(),b.end(),fin))
    {
        for(int i=0;i<n;i++) printf("%d ",fin[i]+1);
        printf("\n");
        return 0;
    }
    vector <int> res(n,-1);
    int maxx=0;
    for(int i=0;i<m;i++)
    {
        vector <int> tmp=b[i];
        int sum=0;
        for(int j=0;j<n;j++) sum+=a[j][tmp[j]];
        for(int j=0;j<n;j++)
            if(tmp[j]!=0)
            {
                tmp[j]--;
                if(!binary_search(b.begin(),b.end(),tmp) && sum-a[j][tmp[j]+1]+a[j][tmp[j]]>maxx)
                {
                    maxx=sum-a[j][tmp[j]+1]+a[j][tmp[j]];
                    res=tmp;
                }
                tmp[j]++;
            }
    }
    for(int i=0;i<n;i++) printf("%d ",res[i]+1);
    printf("\n");
    return 0;
}

 

vector真香啊

上一篇:剑指 Offer 61. 扑克牌中的顺子(简单)


下一篇:1282:最大子矩阵