摘要
这里塔子哥收集了22,23年各公司学校计算机机试真题
http://101.43.147.120/p
我来记录非简单题
k优雅阈值
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,a[N],f[N],x,k;
int c[N];
map<int,int>p[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;
long long ans=0;
for(int i=1;i<=n;i++){
f[i]=f[i-1];
cin>>x;
c[x]++;
p[x][c[x]]=i;
if(c[x]>=k)f[i]=max(f[i],p[x][c[x]-k+1]);
if(f[i])ans+=f[i];
}
cout<<ans;
}
华为od-2022.11.5-插队
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n;
typedef pair<int,int>PII;
priority_queue<PII,vector<PII>,greater<PII>>q;
int id[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
char op;
cin>>op;
if(op=='p'){
cout<<id[q.top().second]<<'\n';
q.pop();
}
else {
int o,x;
cin>>o>>x;
id[i]=o;
q.push({x,i});
}
}
}
分糖果
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,x;
int a[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
int sum=0;
int ans=0;
int mi=1e9;
for(int i=0;i<n;i++)cin>>a[i],sum^=a[i],ans+=a[i],mi=min(mi,a[i]);
if(sum!=0){
cout<<"NO";
return 0;
}
cout<<ans-mi;
}
P1004. 华为校招-2022.9.23-求和
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,f[N],sum;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
f[0]=1;
for(int i=1,x;i<=n;i++){
cin>>x;
sum+=x;
for(int j=1e5;j>=0;j--){
if(j>=x)f[j]+=f[j-x];
}
}
if(sum&1){
cout<<0;
return 0;
}
cout<<f[sum/2];
}
P1078. 美团春招-2023.3.11-第二题-天文爱好者
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n;
typedef pair<int,int>PII;
int ma,ans;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
vector<PII>v;
for(int i=1,x;i<=n;i++){
cin>>x;
v.push_back({x,-1});
}
for(int i=1,x;i<=n;i++){
cin>>x;
v.push_back({x,1});
}
sort(v.begin(),v.end());
int p=0;
int pre=0;
for(auto [x,c]:v){
c=-c;
// cout<<"x="<<x<<" c="<<c<<'\n';
// cout<<"p="<<p<<'\n';
if(c==-1&&p==ma){
ans+=x-pre+1;
p--;
continue;
}
if(c==1&&p+1==ma){
pre=x;
p++;
continue;
}
if(p+c>ma){
ma=p+c;
ans=0;
pre=x;
}
pre=x;
p+=c;
}
cout<<ma<<" "<<ans;
}
(58同城-校招-11.5)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,p[27];
char s[N];
map<char,int>mp;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>s+1;
n=strlen(s+1);
int l=1;
int ans=0;
for(int i=1;i<=n;i++){
if(mp.count(s[i]))l=max(l,mp[s[i]]+1);
mp[s[i]]=i;
ans=max(ans,i-l+1);
}
cout<<ans;
}
P1018. 蚂蚁校招-2022.10.27-由其他元素组成的元素
这是一道多项式题目
#include<bits/stdc++.h>
#define p 1004535809
using namespace std;
#define int long long
typedef long long ll;
const int N=1e5+10;
const int mod=1004535809;
// const int mod=998244353;
int fac[N],inv[N],n,m,k;
typedef vector<int>vi;
#define ksm qpow
int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
b/=2;
a=a*a%mod;
}
return ans;
}
int getinv(int x){
if(x==1)return x;
return getinv(mod%x)*(mod-mod/x)%mod;
}
void init(){
fac[0]=1;
for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod;
inv[N-1]=getinv(fac[N-1]);
for(int i=N-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;
}
vi rev;
void ntt(vi&a,int len,int op=1){
rev.resize(len);
for(int i=0;i<len;i++)rev[i]=(rev[i>>1]>>1)+(i&1)*(len>>1);
for(int i=0;i<len;i++){
if(i<rev[i])swap(a[i],a[rev[i]]);
}
for(int i=1;i<len;i*=2){
int w=ksm(3,(mod-1)/i/2);
for(int j=0;j<len;j+=(i<<1)){
int wn=1;
for(int k=0;k<i;k++,wn=wn*w%mod){
int t=wn*a[i+j+k]%mod;
a[i+j+k]=(a[j+k]-t+mod)%mod;
a[j+k]=(a[j+k]+t)%mod;
}
}
}
if(op==-1){
reverse(a.begin()+1,a.begin()+len);
int inv=ksm(len,mod-2);
for(int i=0;i<len;i++)a[i]=a[i]*inv%mod;
}
}
int C(int n,int k){
if(k>n)return 0;
return fac[n]*inv[k]%mod*inv[n-k]%mod;
}
vi operator*(vi a,vi b){
int re=a.size()+b.size()-1;
int len=1;
while(len<re)len*=2;
a.resize(len),b.resize(len);
ntt(a,len),ntt(b,len);
for(int i=0;i<len;i++)a[i]=a[i]*b[i]%mod;
// for(int i=0;i<len;i++)a[i]=(2-a[i]*b[i]%mod+mod)%mod*a[i]%mod;
ntt(a,len,-1);
a.resize(re);
return a;
}
vi v[N];
vi dfs(int l,int r){
if(l==r)return v[l];
int mid=l+r>>1;
return dfs(l,mid)*dfs(mid+1,r);
}
vi dfs2(int n){
int D=ceil(log2(n));
int len=1ll<<D;
// cout<<"len="<<len<<'\n';
// exit(0);
v[1][0]=qpow(v[0][0],mod-2);
for(int s=2;s<=len;s*=2){
v[2].resize(s);
for(int i=0;i<s;i++)v[2][i]=v[0][i];
v[1]=v[1]*v[2];
// for(int i=s;i<v[1].size();i++)v[1][i]=0;
for(int i=s;i<s*2;i++)v[1][i]=0;
}
return v[1];
}
inline void read(int &x){
x = 0;
char c = getchar();
while(c<'0'||c>'9') c = getchar();
while(c>='0'&&c<='9'){
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
}
inline void mod_read(int &x){
x = 0;
char c = getchar();
while(c<'0'||c>'9') c = getchar();
while(c>='0'&&c<='9'){
x = (((ll)x<<3)+(x<<1)+(c^48))%p;
c = getchar();
}
}
int F[N];
signed main(){
// ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,m,k;
// init();
// cin>>n>>m>>k;
// for(int i=1;i<=m;i++){
// int x;
// cin>>x;
// v[i].resize(x+1);
// for(int j=1;j<=x;j++){
// v[i][j]=C(x,j);
// }
// }
// cout<<dfs(1,m)[k];
cin>>n;
v[1].resize(N);
for(int i=1,x;i<=n;i++){
cin>>x;
F[i]=x;
v[1][x]=1;
}
v[2]=v[1];
auto ans=dfs(1,2);
for(int i=1;i<=n;i++){
int x=F[i];
if(ans[x])cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}
}
蚂蚁校招-2022.10.27-括号匹配
f[i][j]表示前i个左臂右多j的方案数
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=2020;
int n,f[N][N];
char s[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>s+1;
n=strlen(s+1);
f[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<=i;j++){
if(s[i]=='('&&j>0)f[i][j]+=f[i-1][j-1];
if(s[i]==')'&&j+1<=i-1)f[i][j]+=f[i-1][j+1];
if(s[i]=='?'){
if(j>0)f[i][j]+=f[i-1][j-1];
f[i][j]+=f[i-1][j+1];
}
f[i][j]%=mod;
}
}
cout<<f[n][0];
}
百度春招-2023.3.13-第二题-构造回文串
eeeeeeeeeeeeeeeeeeedddddddddddddddddddddddredredredred
x-=a*(a+1)
x-=b*(b+1)
x-=c*(c+1)
持续若干次就好了
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s="red";
int p,x;
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>x;
while(x){
int b=1;
while((b+1)*b/2<=x)b++;
b--;
for(int i=1;i<=b;i++)cout<<s[p];
p=(p+1)%3;
x-=(b+1)*b/2;
}
}
拼多多春招-2023.3.12-多多进行团建
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=1e6+10;
int n,m,S,T,h[N],e[M],ne[M],f[M],w[M];
int incf[N],pre[N],d[N],st[N],idx,q[N];
void add(int a,int b,int c,int d){
e[idx]=b,f[idx]=c,w[idx]=d,ne[idx]=h[a],h[a]=idx++;
e[idx]=a,f[idx]=0,w[idx]=-d,ne[idx]=h[b],h[b]=idx++;
}
bool spfa(){
memset(d,0x3f,sizeof d);
memset(incf,0,sizeof incf);
int hh=0,tt=1;
q[0]=S,d[S]=0,incf[S]=1e9;
while(hh!=tt){
int t=q[hh++];
if(hh==N)hh=0;
st[t]=0;
for(int i=h[t];~i;i=ne[i]){
int ver=e[i];
if(f[i]&&d[ver]>d[t]+w[i]){
d[ver]=d[t]+w[i];
pre[ver]=i;
incf[ver]=min(incf[t],f[i]);
if(!st[ver]){
st[ver]=1;
q[tt++]=ver;
if(tt==N)tt=0;
}
}
}
}
return incf[T]>0;
}
void EK(int &flow,int &cost){
flow=cost=0;
while(spfa()){
int t=incf[T];
flow+=t;
cost+=t*d[T];
for(int i=T;i!=S;i=e[pre[i]^1]){
f[pre[i]]-=t;
f[pre[i]^1]+=t;
}
}
}
unordered_map<string,int>id;
string mp[N];
int vis[N];
void dfs1(int u){
cout<<mp[u-n]<<'\n';
vis[u]=1;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(!f[i]&&j>=1&&j<=n){
dfs1(j+n);
break;
}
}
}
void dfs2(int u){
vis[u]=1;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(!f[i]&&j>=1&&j<=n&&!vis[j+n]){
dfs2(j+n);
}
}
cout<<mp[u-n]<<'\n';
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
memset(h,-1,sizeof h);
cin>>n;
S=0,T=N-1;
for(int i=1;i<=n;i++)add(S,i,1,0);
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(auto c:s){
int j=c-'A'+n+1;
add(i,j,1,0);
}
}
for(int j=n+1;j<=n+3;j++){
int x,y;
cin>>x>>y;
// int k=j+10;
// add(j,k,x,y);
// add(k,T,1e9)
add(j,T,x,y);
}
int flow,cost;
EK(flow,cost);
if(flow!=n)cout<<"NO"<<'\n'<<flow;
else cout<<"YES"<<'\n'<<cost;
}
P1023. 百度校招-2022.9.13-删除游戏
跳着拿就好
携程算法岗-2023.3.7-第三题:游游出游
#include<bits/stdc++.h>
using namespace std;
double v,x,y;
signed main(){
cin>>v>>x>>y;
double t=max(0.0,(sqrt(x*y)-v))/x;
double ft=1e9;
if(v<1)ft=y/v;
ft=min(ft,t+y/(v+t*x));
printf("%.5lf",ft);
}
导数做法不知道为什么错了
居然要用三分法
#include <bits/stdc++.h>
using namespace std;
int v, x, y;
double res = 1e9;
double calc(double t1) {
double t = y / (v+t1*x) + t1;
res = min(res, t);
return t;
}
int main()
{
cin >> v >> x >> y;
double L = 0, R = 1e9;
for(int i = 0 ; i <= 5000 ; i ++){
double lmid=L+(R-L)/3;
double lres = calc(lmid);
double rmid=R-(R-L)/3;
double rres = calc(rmid);
if (lres <= rres) {
R = rmid;
} else {
L = lmid;
}
}
printf("%.9lf\n", res);
}
携程算法岗-2023.3.7-第四题:游游买商品
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2020+10;
int f[N][N],n,m;
int a[N],b[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
int ans=0;
for(int i=1;i<=n;i++){
for(int j=m;j>=0;j--){
f[i][j]=f[i-1][j];
if(j>=a[i])f[i][j]=max(f[i][j],f[i-1][j-a[i]]+b[i]);
int c=a[i-1]+a[i]/2;
if(i>=2&&j>=c)f[i][j]=max(f[i][j],f[i-2][j-c]+b[i-1]+b[i]);
ans=max(ans,f[i][j]);
}
}
cout<<ans;
}
#P1017. 蚂蚁校招-2022.10.27-数位和为n的最大整数
#include<bits/stdc++.h>
using namespace std;
int n;
signed main(){
cin>>n;
if(n>45){
cout<<-1;
return 0;
}
int ans=-1;
for(int i=1;i<(1<<9);i++){
int sum=0;
int t=0;
for(int j=8;j>=0;j--){
if(i>>j&1){
sum+=j+1;
t=t*10+j+1;
}
}
if(sum==n){
ans=max(ans,t);
}
}
cout<<ans;
}
字节校招-2022.10.9-二叉树染色
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,c[N];
string s="RB";
vector<int>g[N];
void dfs(int u=1,int fa=0){
int sz=0;
for(auto j:g[u]){
if(j==fa)continue;
dfs(j,u);
sz++;
}
c[u]=sz%2==0;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
dfs();
for(int i=1;i<=n;i++)cout<<s[c[i]];
}
#P1084. 阿里春招-2023.3.15-第三题-k次操作最小化极差
这是目前做过的最难的一道题
用multiset维护一个集合,然后枚举l和r进行删数加数
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int n,k,a[N];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n>>k;
if(n==1){
cout<<0;
return 0;
}
//l=0~k
// aaaaaa xxxxx bbbbb
int ans=2e9;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
if(k==0){cout<<a[n]-a[1];return 0;}
multiset<int>S;
for(int i=1;i<=n-k;i++)S.insert(a[i]);
for(int i=n-k+1;i<=n;i++)S.insert(a[i]/2);
auto L=S.begin();
auto R=--S.end();
ans=min(ans,*R-*L);
for(int l=1,r=n-k+1;l<=k;l++,r++){
auto prel=S.lower_bound(a[l]);
S.erase(prel);
S.insert(a[l]*2);
auto prer=S.lower_bound(a[r]/2);
S.erase(prer);
S.insert(a[r]);
auto L=S.begin();
auto R=--S.end();
ans=min(ans,*R-*L);
}
cout<<ans;
}
P1072. 百度校招-2023.3.7-第三题-魔法师
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int n,a[N];
int mp[2];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
cin>>n;
int A=0,B=0;
mp[0]=1;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>0)a[i]=0;
else a[i]=1;
a[i]^=a[i-1];
A+=mp[a[i]];
B+=mp[a[i]^1];
mp[a[i]]++;
}
cout<<B<<" "<<A;
}
P1025. 华为校招-2022.11.9-攻城战
每门炮在时间限制上是独立的
f[i]表示准确使用i的体积的时候的最大贡献
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2020;
int n,m,T;
int f[1010];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>T;
memset(f,-0x3f,sizeof f);
f[0]=0;
//每门炮在时间的限制上是独立的
for(int i=1;i<=n;i++){
int a,b,c;
cin>>a>>b>>c;
for(int j=m;j>=0;j--){
int mx=min(T/c,(m-j)/b);
for(int k=1;k<=mx;k++){
f[j+k*b]=max(f[j+k*b],f[j]+k*a);
}
}
}
int ans=0;
for(int i=m;i>=0;i--)ans=max(ans,f[i]);
cout<<ans;
}
P1053. 华东师范大学保研机试-2022-Minimum_Sum
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10,M=40*N;
int n,q,root[N];
int ls[M],rs[M],c[M],o,a[M];
void pushup(int u){
c[u]=c[ls[u]]+c[rs[u]];
a[u]=a[ls[u]]+a[rs[u]];
}
void ins(int &u,int p,int x,int l=1,int r=1e9){
u=++o;
a[u]=a[p],c[u]=c[p],ls[u]=ls[p],rs[u]=rs[p];
if(l==r){
c[u]++;
a[u]+=x;
return;
}
int mid=l+r>>1;
if(x<=mid)ins(ls[u],ls[p],x,l,mid);
else ins(rs[u],rs[p],x,mid+1,r);
pushup(u);
}
int L=0,R=0;
int query(int u,int p,int k,int l=1,int r=1e9){
if(l==r)return r;
int mid=l+r>>1;
int lc=c[ls[u]]-c[ls[p]];
int Ls=a[ls[u]]-a[ls[p]];
int Rs=a[rs[u]]-a[rs[p]];
if(k<=lc){
// R+=Rs;
return query(ls[u],ls[p],k,l,mid);
}
else {
// L+=Ls;
return query(rs[u],rs[p],k-lc,mid+1,r);
}
}
int ql(int u,int p,int x,int l=1,int r=1e9){
if(x>=r)return a[u]-a[p];
if(l==r)return 0;
int mid=l+r>>1;
if(x<=mid)return ql(ls[u],ls[p],x,l,mid);
return a[ls[u]]-a[ls[p]]+ql(rs[u],rs[p],x,mid+1,r);
}
int qr(int u,int p,int x,int l=1,int r=1e9){
if(x<l)return a[u]-a[p];
if(l==r)return 0;
int mid=l+r>>1;
if(x>mid)return qr(rs[u],rs[p],x,mid+1,r);
return a[rs[u]]-a[rs[p]]+qr(ls[u],ls[p],x,l,mid);
}
int qk(int u,int p,int x,int l=1,int r=1e9){
if(l==r)return c[u]-c[p];
int mid=l+r>>1;
int lc=c[ls[u]]-c[ls[p]];
if(x<=mid)return qk(ls[u],ls[p],x,l,mid);
return lc+qk(rs[u],rs[p],x,mid+1,r);
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1,x;i<=n;i++){
cin>>x;
ins(root[i],root[i-1],x);
}
cin>>q;
while(q--){
int l,r;
cin>>l>>r;
int len=r-l+1;
int k=(r-l+2)/2;
//小于等于k的就是
L=0,R=0;
int x=query(root[r],root[l-1],k);
//L是小于等于x的权值和
L=ql(root[r],root[l-1],x);
R=qr(root[r],root[l-1],x);
int K=qk(root[r],root[l-1],x);
// cout<<"k="<<k<<" x="<<x<<'\n';
// cout<<"K="<<K<<" L="<<L<<" R="<<R<<'\n';
int ans=K*x-L + R-(len-K)*x;
cout<<ans<<'\n';
}
}