序列问题

1.序列

题意

image

分析

image

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N],c[N];
int m,n;
void divide(int a[ ],int b[ ])
{
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>s;
    for(int i=1;i<=m;i++)
    {
        s.push({a[1]+b[i],1});
    }
    for(int i=1;i<=m;i++)
    {
        c[i]=s.top().first;
        int t=s.top( ).second;
        s.pop( );
        s.push(make_pair(c[i]-a[t]+a[t+1],t+1));
    }
    for(int i=1;i<=m;i++)
    a[i]=c[i];
    
}
int main( )
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(int i=1;i<=m;i++)
        scanf("%d",&a[i]);
        sort(a+1,a+m+1);
        n--;
        while(n--)
        {
            for(int i=1;i<=m;i++)
            {
                scanf("%d",&b[i]);
            }
            sort(a+1,a+m+1);
            divide(a,b);
        }
        for(int i=1;i<=m;i++)
        printf("%d ",a[i]);
        cout<<endl;
    }
}

2.CF1574D The Strongest Build

题意

image

分析

和上题差不多做法,但是他序列长度不一定相同,必须得用vetocr具体实现看代码

代码

/*made in mrd*/
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int M=5e3+10;
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
#define fi first
#define se second
#define cout1(x) cout<<x<<endl
#define cout2(x,y) cout<<x<<' '<<y<<endl
#define pii pair<int,int>
#define piii pair<int,pii>
#define pb push_back
vector<int>a[N];
     int m;
#define piv pair <int,vector<int>>
set<vector<int>>s;
vector<piv>res;
    priority_queue<piii>q;
void divedes(vector<piv> &b,vector<int>c)
{
    vector<piv>d;
    for(int i=0;i<c.size();i++)
    {
        q.push({b[0].fi+c[i],{0,i}});
    }
    
    for(int i=0;i<=m&&q.size();i++)
    {
        auto x=q.top();
        q.pop();
        d.push_back(b[x.second.first]);
        d.back().first=x.first;
        d.back().second.push_back(x.second.second);
        if(x.se.fi+1<b.size())
        q.push({x.first-b[x.second.first].fi+b[x.second.fi+1].fi,{x.second.fi+1,x.second.se}});
    }
    while(q.size()) q.pop();
    b=d;
}
signed main() {
    int n;
    cin>>n; 
    for(int i=1;i<=n;i++)
    {
        int c;
        cin>>c;
        for(int j=1;j<=c;j++) {
            int x;
            cin>>x;
            a[i].push_back(x);
        }
     }
     cin>>m;
         vector<int>b;
     for(int i=1;i<=m;i++)
     {
         b.resize(n);
         for(int j=0;j<n;j++) cin>>b[j],b[j]--;
         s.insert(b);
     }
     //res.resize(m+1);
     res.push_back({0,vector<int>(0)});
     for(int i=1;i<=n;i++)
     {
         divedes(res,a[i]);
         //sort(res.begin(),res.end(),great<int>());
     }
     
     for(int i=0;i<=m;i++)
     {

         if(!s.count(res[i].second))
         {
             for(int j=0;j<n;j++)
                {
                    cout<<res[i].second[j]+1<<" ";
                }
                cout<<endl; 
                break;
         }
     }
    return 0;
}

3.Apocryphal Vir Pulcher

题意

image

分析

image

代码

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <ctime>
#include <queue>
#define LL long long
using namespace std;
const int MAXN = 85;
queue <LL> que[MAXN];
int n, k, a[MAXN], num;
LL minn;
int main() {
    scanf("%d%d", &n, &k); k --;
    for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
    que[0].push(0);
    for(int i = 1; i <= k + 1; i ++) {
        minn = 9e18;
        for(int j = 0; j <= n; j ++) if(!que[j].empty() && que[j].front() < minn) minn = que[j].front(), num = j;
       if(i==1){ while(que[0].size()) que[0].pop();}
        que[num].pop();
        for(int j = num; j <= n; j ++) que[j].push(minn + a[j]);
    }
    printf("%lld", minn);
    return 0;
}
posted @ 2021-12-31 14:51  m_rd  阅读(47)  评论(0)    收藏  举报