牛客小白月赛56

今天无聊vp了一下

A.省略

B.最优肯定是全部都是1

C.直接统计每个余数下可以填多少个数,然后排序从小到大的排序输出即可

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 2e5+10,M=1e7+10;
int n,m,k;
int a[N];
int sum[N];
void solve()
{
    cin>>n;
    vector cnt(15,0);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        cnt[i%10]++;
    }
    vector> g(15);
    sort(a+1,a+1+n);
    int idx=1;
    for(int i=0;i<=10;i++)
    {
        for(int j=1;j<=cnt[i];j++)
            {
                g[i].push_back(a[idx]);
                idx++;
            }
    }
    int now=0;
    for(int i=1;i<=n;i++)
    {
        cout<>t;
    while(t--) solve();
}

D:

直接把1e7里面的质数筛出来就行,数组最多20w,大于20w的质数根本用不上

然后用个set维护就行了预处理出答案

牛客小白月赛56_第1张图片

 E贪心,让每个相邻的ZZ在一起,每个ZZ在一起要除掉中间的z,所以

直接统计中间z的个数,每次取最小即可,贡献是4

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 2e5+10,M=1e7+10;
#define int long long
int n,m,k;
int a[N];
int sum[N];
void solve()
{
    string s;
    cin>>n>>k>>s;
    s="?"+s;
    int cnt=0;
    long long res=0,mx=1;
    for(int i=1;i<=n;i++)
    {
        if(s[i]=='z'){
            a[i]=0;
        }
        else a[i]=2;
    }  
    int last=-1;
    priority_queue,greater> q;
    for(int i=1;i<=n;i++)
    {
        if(a[i]==2&&last==-1){
            last=i;
            continue;
        }
        if(a[i]==2)
        {
            q.push(i-last-1);
            last=i;
        }
    }
    while(k>0&&q.size())
    {
        if(k>t;
    while(t--) solve();
}

F.

这个题其实是板子题我觉得,首先肯定是用优先队列的因为边权不同

然后分析状态n个点,每个点用没用过魔法,其他点已经受影响的次数

首先用了两次等于没用过,所以状态就是n*2*2

复杂度mlog(n*2*2)

我这里的state代表在这个有没有用过魔法,

staten是其他点有没有受到影响

如果state变成1,那么其他点要全部改变,所以也要变化

判断的时候,t点用魔法是不改变自己的,所以t加上全局影响即可

但是j点是会受到t魔法的,所以不仅要加上全局影响,还要加上t影响

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 2e5+10,M=1e7+10;
#define int long long
typedef pair PII;
using node=tuple;
int n,m,k;
int w[N],dist[N][3][3];
int x,y,z;
vector g[N];
int bfs(){
    memset(dist,-1,sizeof(dist));
    priority_queue,greater> q;
    q.push({0,1,0,0});
    while(q.size())
    {
        auto [d,t,state,staten]=q.top();
        q.pop();
        if(t==n) return d;
        if(dist[t][state][staten]!=-1) continue;
        dist[t][state][staten]=d;
        if(dist[t][state^1][staten^1]==-1)
        {
            q.push({d+z,t,state^1,staten^1});
        }
        for(auto&j:g[t])
        {
            if((w[j]^staten^state)==(w[t]^staten))
            {
                q.push({d+x,j,0,staten});
            }
            else{
                q.push({d+y,j,0,staten});
            }
        }
    }
    return 0;
}
void solve()
{
    cin>>n>>m;
    cin>>x>>y>>z;
    for(int i=1;i<=n;i++) cin>>w[i];
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    cout<>t;
    while(t--) solve();
}

你可能感兴趣的:(算法,c++,数学建模)