<>字节跳动2019春招算法题
<>1.总结
难度:容易到中等。
一些题出的太烂,不给数据范围,而且内存设置有问题,如果是刷题不建议刷。
<>2.题目
<>(1)
简单字符串模拟。
#include<bits/stdc++.h> using namespace std; int main(){ int n; scanf("%d",&n);
for(int i=1;i<=n;i++){ string s;cin>>s; int p = 0; int ok = 0; do{ int m = s.
size(); ok = 0; for(int j=0;j<m;j++){ if(j+2<m && s[j+1] == s[j] && s[j+2] == s[
j]){ s.erase(s.begin()+j); ok = 1;break; } if(j+3<m && s[j+1] == s[j] && s[j+2]
== s[j+3]){ s.erase(s.begin()+j+3); ok = 1; break; } } }while(ok); cout<<s<<'\n'
; } return 0; }
<>(2)
简单计数问题。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef
unsigned long long ull; const int N=1e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=99997867;
const int hashmod[4] = {402653189,805306457,1610612741,998244353}; #define
mst(a,b) memset(a,b,sizeof a) #define db double #define PII pair<int,int> #
define PLL pair<ll,ll> #define x first #define y second #define pb emplace_back
#define SZ(a) (int)a.size() #define rep(i,a,b) for(int i=a;i<=b;++i) #define
per(i,a,b) for(int i=a;i>=b;--i) #define IOS
ios::sync_with_stdio(false),cin.tie(nullptr) void Print(int *a,int n){ for(int i
=1;i<n;i++) printf("%d ",a[i]); printf("%d\n",a[n]); } template <typename T>
//x=max(x,y) x=min(x,y) void cmx(T &x,T y){ if(x<y) x=y; } template <typename T>
void cmn(T &x,T y){ if(x>y) x=y; } int n,d; int a[N]; int main(){ scanf("%d%d",&
n,&d); rep(i,1,n){ scanf("%d",&a[i]); } ll s = 0; rep(i,1,n){ int p =
upper_bound(a+i,a+n+1,a[i]+d)-a-1; ll tmp = p-i; ll v = max(tmp*(tmp-1)>>1,0ll);
//printf("i=%d,v=%lld\n",i,v); s = (s+v)%mod; } printf("%lld\n",s); return 0; }
<>(3)
dfs就完事了。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef
unsigned long long ull; const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353}; #define
mst(a,b) memset(a,b,sizeof a) #define db double #define PII pair<int,int> #
define PLL pair<ll,ll> #define x first #define y second #define pb emplace_back
#define SZ(a) (int)a.size() #define rep(i,a,b) for(int i=a;i<=b;++i) #define
per(i,a,b) for(int i=a;i>=b;--i) #define IOS
ios::sync_with_stdio(false),cin.tie(nullptr) void Print(int *a,int n){ for(int i
=1;i<n;i++) printf("%d ",a[i]); printf("%d\n",a[n]); } template <typename T>
//x=max(x,y) x=min(x,y) void cmx(T &x,T y){ if(x<y) x=y; } template <typename T>
void cmn(T &x,T y){ if(x>y) x=y; } int a[10]; int b[10]; int c[10],ok; void dfs(
int x){ if(ok) return; if(x==4){ ok = 1; return; } for(int i=1;i<10;i++){ if(a[i
]>=3){ a[i]-=3; dfs(x+1); a[i]+=3; } } for(int i=1;i<=7;i++){ if(a[i]>0 && a[i+1
]>0 &&a[i+2]>0){ a[i]--,a[i+1]--,a[i+2]--; dfs(x+1); a[i]++,a[i+1]++,a[i+2]++; }
} } bool ck(){ for(int i=1;i<=9;i++){ if(a[i]<2) continue; a[i]-=2; ok = 0; dfs(
0); a[i]+=2; if(ok) return true; } return false; } int main(){ rep(i,1,9) b[i] =
4; rep(i,1,13){ int x;scanf("%d",&x); a[x]++; b[x]--; } int jg =0; for(int i=1;i
<=9;i++){ if(!b[i]) continue; a[i]++; if(ck()) printf("%d ",i),jg=1; a[i]--; }
if(!jg) puts("0"); return 0; }
<>(4)
简单模拟题 。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef
unsigned long long ull; const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353}; #define
mst(a,b) memset(a,b,sizeof a) #define db double #define PII pair<int,int> #
define PLL pair<ll,ll> #define x first #define y second #define pb emplace_back
#define SZ(a) (int)a.size() #define rep(i,a,b) for(int i=a;i<=b;++i) #define
per(i,a,b) for(int i=a;i>=b;--i) #define IOS
ios::sync_with_stdio(false),cin.tie(nullptr) void Print(int *a,int n){ for(int i
=1;i<n;i++) printf("%d ",a[i]); printf("%d\n",a[n]); } template <typename T>
//x=max(x,y) x=min(x,y) void cmx(T &x,T y){ if(x<y) x=y; } template <typename T>
void cmn(T &x,T y){ if(x>y) x=y; } map<PII,vector<int> >mp; int main(){ int t;
cin>>t; while(t--){ mp.clear(); int n;cin>>n; rep(i,1,n){ int m ;cin>>m; map<PII
,bool>vis; rep(j,1,m){ int x,y;cin>>x>>y; if(!vis[{x,y}]) mp[{x,y}].pb(i),vis[{x
,y}] =true; } } int mx = 0; int ans = 0; for(auto [_,v]:mp){ int sz= SZ(v); int
cnt= 0; for(int i=0;i<sz;i++){ if(!i ||v[i]==v[i-1]+1){ cnt++; } else { ans=max(
ans,cnt); cnt = 1; } } ans=max(ans,cnt); } printf("%d\n",ans); } return 0; }
<>(5)
比较板的状压dp,但是出的什么牛马,卡空间。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef
unsigned long long ull; const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353}; #define
mst(a,b) memset(a,b,sizeof a) #define db double #define PII pair<int,int> #
define PLL pair<ll,ll> #define x first #define y second #define pb emplace_back
#define SZ(a) (int)a.size() #define rep(i,a,b) for(int i=a;i<=b;++i) #define
per(i,a,b) for(int i=a;i>=b;--i) #define IOS
ios::sync_with_stdio(false),cin.tie(nullptr) void Print(int *a,int n){ for(int i
=1;i<n;i++) printf("%d ",a[i]); printf("%d\n",a[n]); } template <typename T>
//x=max(x,y) x=min(x,y) void cmx(T &x,T y){ if(x<y) x=y; } template <typename T>
void cmn(T &x,T y){ if(x>y) x=y; } int a[20][20]; int dp[1<<18][18]; int main(){
int n ;cin>>n; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; int st =
1<<n; mst(dp,0x3f); dp[1][0] = 0; int ans = 1e9; for(int i=0;i<st;i++) for(int j
=0;j<n;j++){ if(i>>j&1){ for(int k=0;k<n;k++){ if(!(i>>k&1)){ cmn(dp[i|(1<<k)][k
],dp[i][j]+a[j][k]); } } } } st--; for(int i=0;i<n;i++) cmn(ans,dp[st][i]+a[i][0
]); printf("%d\n",ans); return 0; }
<>(6)
典中典的贪心题。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef
unsigned long long ull; const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353}; #define
mst(a,b) memset(a,b,sizeof a) #define db double #define PII pair<int,int> #
define PLL pair<ll,ll> #define x first #define y second #define pb emplace_back
#define SZ(a) (int)a.size() #define rep(i,a,b) for(int i=a;i<=b;++i) #define
per(i,a,b) for(int i=a;i>=b;--i) #define IOS
ios::sync_with_stdio(false),cin.tie(nullptr) void Print(int *a,int n){ for(int i
=1;i<n;i++) printf("%d ",a[i]); printf("%d\n",a[n]); } template <typename T>
//x=max(x,y) x=min(x,y) void cmx(T &x,T y){ if(x<y) x=y; } template <typename T>
void cmn(T &x,T y){ if(x>y) x=y; } int main(){ int n;cin>>n; n = 1024-n; int s =
0; s+=n/64; n%=64; s+=n/16; n%=16; s+=n/4; n%=4; s+=n; printf("%d\n",s); return
0; }
<>(7)
二分一下就好了,因为是递推题,其实还可以O(n)倒着递推。
注意二分check里爆范围。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef
unsigned long long ull; const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {402653189,805306457,1610612741,998244353}; #define
mst(a,b) memset(a,b,sizeof a) #define db double #define PII pair<int,int> #
define PLL pair<ll,ll> #define x first #define y second #define pb emplace_back
#define SZ(a) (int)a.size() #define rep(i,a,b) for(int i=a;i<=b;++i) #define
per(i,a,b) for(int i=a;i>=b;--i) #define IOS
ios::sync_with_stdio(false),cin.tie(nullptr) void Print(int *a,int n){ for(int i
=1;i<n;i++) printf("%d ",a[i]); printf("%d\n",a[n]); } template <typename T>
//x=max(x,y) x=min(x,y) void cmx(T &x,T y){ if(x<y) x=y; } template <typename T>
void cmn(T &x,T y){ if(x>y) x=y; } ll a[N],n; bool ck(ll x){ ll e = x; rep(i,1,n
){ ll v = e - a[i]; //if(x==4) printf("e=%lld,v=%lld\n",e,v); e+=v; if(e<0)
return false; if(e>1e5) return true; } // /printf("x=%lld\n",x); return true; }
int main(){ cin>>n; rep(i,1,n) cin>>a[i]; ll l=1,r=1e5;ll ans = 0; while(l<=r){
ll m= l+r>>1; //printf("m=%d\n",m); if(ck(m)) ans=m,r=m-1; else l=m+1; } printf(
"%lld\n",ans); return 0; }