携程笔试 2025.3.13

1.诗

第一行1个字,之后每行字数增加1,输出每行第一列字符。

#include <bits/stdc++.h>
using namespace std;
string s,ans;
int main() {
    int d,idx;
    cin>>s;
    idx=1;
    d=idx;
    for(int i=0;i<s.size();i++) {
        while(d) {
            if(d==idx) {
                ans+=s[i];
            }
            d--;
            i++;
        }
        idx++;
        d=idx;
        i--;
    }
    cout<<ans;
    return 0;
}

2.数组染色

数组排序,当前值+数组长度,然后去掉相同值完后循环。

#include <bits/stdc++.h>
using namespace std;
int T,n;
long long ans;
int main() {
    cin>>T;
    while(T--) {
        cin>>n;
        vector<int> v(n),s(n+1);
        for(int i=0;i<n;i++) cin>>v[i];
        sort(v.begin(),v.end());
        ans=0;
        for(int i=0;i<n;i++) {
            int t=v[i],j=i;
            while(j<n && v[i]==v[j]) j++;
            if(t+n-i>ans) ans=t+n-i;  
            i=j-1;
        }
        cout<<ans<<endl;
    }
    return 0;
}

3.数组询问

求出每个数的所有的质因数然后前缀和,计算缺少长度为k的子数组最大值

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,k,x;
long long a[N],s[N],ans;
bool is_prime(int x) {
    if(x==1) return 0;
    if(x==2) return 1;
    for(int i=2;i<=x/i;i++) {
        if(x%i==0) return 0;
    }
    return 1;
}
int calc(int x){
    int cnt=0;
    if(x==1) return cnt;
    for(int i=1;i<=x/i;i++) {
        if(x%i==0) {
            if(is_prime(i)) cnt++;
            if(x/i!=i) {
                if(is_prime(x/i)) cnt++;
            }
        }
    }
    return cnt;
}
int main() {
    cin>>n>>k;
    for(int i=0;i<n;i++) 
    {
        cin>>x;
        a[i]=calc(x);
    }
    for(int i=1;i<=n;i++) {
        s[i]=s[i-1]+a[i-1];
    }

    for(int i=k;i<=n;i++) {
        int t=s[i]-s[i-k];
        ans=max(ans,s[n]-t);
    }
    cout<<ans;

    return 0;
}

4.偶数路径

通过52.3%,用一个集合记录当前所包含的所有点,如果这些点的gcd为偶数就答案增加1,同时用一个大集合S把所有这个合法集合加入到里面。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int gcd(int a,int b) {
    return b?gcd(b,a%b):a;
}
int n,a[N],ans;
int h[N],e[2*N],ne[2*N],idx;
bool st[N];
set<set<int> > S;
void dfs(int u,int fa,int curgcd,set<int>& se) {
    if(curgcd%2==0 && !S.count(se)) {
        ans++;
        S.insert(se);
        // for(auto x:se) cout<<x<<" ";
        // puts("");
    }
    for(int i=h[u];~i;i=ne[i]) {
        int j=e[i];
        if(j!=fa) {
            int tt=gcd(curgcd,a[j]);
            if(tt%2) continue;
            auto ST=se;
            ST.insert(j);
            dfs(j,u,tt,ST);
        }
    }
}
void add(int a,int b) {
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int main() {
    memset(h,-1,sizeof(h));
    cin>>n;
    for(int i=1;i<=n;i++) {
        cin>>a[i];
    }
    int aa,b;
    for(int i=0;i<n-1;i++) {
        cin>>aa>>b;
        add(aa,b);
        add(b,aa);
    }
    for(int i=1;i<=n;i++) {
        set<int> se;
        se.insert(i);
        dfs(i,-1,a[i],se);
    }
    cout<<ans;
    return 0;
}
#携程求职进展汇总#
全部评论

相关推荐

评论
3
7
分享

创作者周榜

更多
牛客网
牛客企业服务