牛客周赛 Round 34(A~F)

A. 小红的字符串生成

如果字母相同,那么只有两种组合a与aa,否则四种排列组合

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    string a,b;
    cin>>a>>b;
    if(a==b) {
        cout<<2<<'\n'<<a<<'\n'<<(a+b)<<'\n';
    } else {
        cout<<4<<'\n';
        cout<<a<<'\n'<<b<<'\n'<<(a+b)<<'\n'<<(b+a)<<'\n';
    }
    return 0;
}

B. 小红的非排列构造

首先看一下是不是非排列,如果不是的话就不用改了,是的话就把第一个改成一个大于 1 0 5 10^5 105的数

#include <bits/stdc++.h>
using namespace std;
int arr[100010];
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    int n;
    bool flag=true;
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>arr[i];
    }
    sort(arr+1,arr+n+1);
    for(int i=1;i<=n;i++) {
        flag=flag&&arr[i]==i;
    }
    
    if(!flag) {
        cout<<0<<'\n';
    } else {
        cout<<1<<'\n'<<"1 1000000"<<'\n';
    }
    return 0;
}

C. 小红的数字拆解

因为给出的是一个偶数,所以这个数一定能全部分成偶数。用字符串读入,从前往后遍历,如果是偶数就直接存起来,如果是奇数那么存到临时变量中继续找,直到找到一个偶数再把临时变量存起来。最后把存起来的数从小到大排序

#include <bits/stdc++.h>
using namespace std;
typedef pair<string,int> psi;
map<string,int> mp;
bool cmp(psi x,psi y)
{
    string a=x.first,b=y.first;
    if(a.length()!=b.length()) return a.length()<b.length();
    else {
        for(int i=0;i<a.length();i++) {
            if((a[i]-'0')!=(b[i]-'0')) return (a[i]-'0')<(b[i]-'0');
        }
    }
    return false;
}
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    string number,temp;
    cin>>number;
    for(int i=0;i<number.length();i++) {
        if((number[i]-'0')%2) {
            temp+=number[i];
        } else {
            temp+=number[i];
            mp[temp]++;
            temp="";
        }
    }
    vector<pair<string,int>> ans;
    for(auto [a,b]:mp) {
        ans.push_back({a,b});
    }
    sort(ans.begin(),ans.end(),cmp);
    for(auto [a,b]:ans) {
        while(b--) {
            cout<<a<<'\n';
        }
    }
    return 0;
}

D. 小红的陡峭值

做题的时候迷迷糊糊的,没看清楚题目意思被卡住了,把所有非0数找出来放到一个vector中,判断一下陡峭值res,有以下几种情况:

  • 全部是0:直接输出一个符合的数组
  • res==0:说明只存在一个数 x,如果原数组中首位都非0则无解,否则将其中任意一个位置改成x+1
  • 上面两种排除无解情况之后,从前向后遍历一遍数组,把所有 0 的位置改成前面最近的一个非 0 的数,再从后向前遍历,同样操作。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int arr[100010];
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    int n;
    cin>>n;
    vector<int>b;
    for(int i=1;i<=n;i++) {
        cin>>arr[i];
        if(arr[i]) b.push_back(arr[i]);
    }
    
    if(count(arr+1,arr+n+1,0)==n) {
        cout<<1<<' ';
        for(int i=1;i<n;i++) cout<<2<<' ';
    } else {
        ll res=0;
        for(int i=1;i<b.size();i++) res+=abs(b[i]-b[i-1]);
        if(res>1) {
            cout<<-1<<'\n';
        } else if(res==0) {
            if(arr[1]!=0&&arr[n]!=0) {
                cout<<-1<<'\n';
            } else {
                cout<<(arr[1]==0?b[0]+1:b[0])<<' ';
                for(int i=2;i<n;i++) cout<<b[0]<<' ';
                cout<<(arr[1]==0?b[0]:b[0]+1);
            }
        } else {
            int last=0;
            for(int i=1;i<=n;i++) {
                if(arr[i]==0) arr[i]=last;
                last=arr[i];
            }
            last=0;
            for(int i=n;i;i--) {
                if(arr[i]==0) arr[i]=last;
                last=arr[i];
            }
            for(int i=1;i<=n;i++)
                cout<<arr[i]<<' ';
        }
    }
    return 0;
}

E.小红的树形 dp

dfs,但是被我做复杂了,记得特判全是?的情况

#include <bits/stdc++.h>
using namespace std;
int n,d[100010],rt=1;
bool st[100010];
string str;
vector<int> h[100010];
bool succ=true;
char dfs(int u,int from)
{
    if(st[u]) return str[u-1];
//     cout<<u<<'\n';
    for(int i=0;i<h[u].size();i++) {
        int j=h[u][i];
        if(j==from) continue;
        if(str[j-1]=='?'&&str[u-1]!='?') str[j-1]=str[u-1]=='d'?'p':'d';
        char res=dfs(j,u);
        if(res!='?') {
            if(str[u-1]=='?') str[u-1]=(res=='d'?'p':'d');
            if(str[u-1]==res) succ=false;
        }
    }
 
    st[u]=true;
//     if(str[u-1]=='?') st[0x3f3f3f3f]=1;
    return str[u-1];
}
void eval(int u,int from)
{
    for(int i=0;i<h[u].size();i++) {
        int j=h[u][i];
        if(j==from) continue;
        if(str[j-1]=='?') str[j-1]=str[u-1]=='d'?'p':'d';
        eval(j,u);
    }
}
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    cin>>n>>str;
    for(int i=1;i<n;i++) {
        int a,b;
        cin>>a>>b;
        h[a].push_back(b),h[b].push_back(a);
        d[a]++,d[b]++;
    }
    bool allq=true;
    for(int i=0;i<str.length();i++) {
        if(str[i]!='?') {
            allq=false;break;
        }
    }
    while(d[rt]>2) rt++;
    if(allq) str[rt]='d';
    dfs(rt,-1);
    if(succ) {
        eval(rt,-1);
        cout<<str<<'\n';
    } else {
        cout<<-1;
    }
    return 0;
}

F.小红的矩阵构造

cf原题,参考了大佬的题解
设想将所有行和列的异或和变为1,题目中明确指出 x 为偶数,那么当 x 是 4 的倍数时,可以将 x 除以 4,可以将四个数摆成正方形:

x x
x x

当 x 不是 4 的倍数时,若 x=2 则无解,若 x = 6 的摆法:

1 1 0
0 1 1
1 0 1

若 x > 6,可以从中减出 6 个按上面第二种方式摆在右下角,剩下的按第一种摆在左上角,注意此时 n 与 m 不能同时为 4,不然无法同时摆下这两种形状

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false),cin.tie(0);
    int n,m,x;
    cin>>n>>m>>x;
    vector<vector<int>> g(n+1,vector<int>(m+1));
    if(x%4==0) {
        x/=4;
        g[1][1]=g[1][2]=g[2][1]=g[2][2]=x;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cout<<g[i][j]<<" \n"[j==m];
    } else {
        if(x==2) {
            cout<<-1;
        } else {
            if(x>6&&m==4&&n==4) {
                cout<<-1;
            } else {
                x=(x-6)/4;
                g[n][m]=g[n][m-2]=g[n-1][m]=g[n-1][m-1]=g[n-2][m-1]=g[n-2][m-2]=1;
                g[1][1]+=x,g[1][2]+=x,g[2][1]+=x,g[2][2]+=x;
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=m;j++)
                        cout<<g[i][j]<<" \n"[j==m];
            }
        }
    }
    return 0;
}
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法数据结构进行有效地结合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值