携程笔试 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;
}
#携程求职进展汇总#