8月20网易笔试感觉题不错写一下还没找到hack数据代码附上
大二acm菜鸡,昨天学姐的面试题,今天瞅了一眼感觉题还不错,就写了一下,还没找到hack数据,感觉应该没什么问题。代码附上,自行查看
题目:题目是自己找的,听说每个人的题还不一样,仔细看清题目再看代码
题目找自网友
题目:
//A题 #include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; const int N=2e5+7; int dp[N][5]; signed main() { string s , rs , ts; cin>>s; rs=s; ts=s; int slen=s.length(); int flag=0; if(slen%3==0) flag=1; else if(slen%3==1) flag=2; else if(slen%3==2) flag=3; int ans=0; if(flag==1) { for(int i=0;i<slen;i++) { if(i%3==1) { if(s[i]!='e') ans++; if(s[i-1]!='d'&&s[i+1]!='d') ans++; if(s[i-1]!='r'&&s[i+1]!='r') ans++; } } cout<<ans<<endl; }else if(flag==2) { for(int i=0;i<slen;i++) { if(i==0) { if(s[i+2]=='d'&&s[i]!='r') { s[i]='r'; dp[i][0]++; }else if(s[i+2]=='r'&&s[i]!='d') { s[i]='d'; dp[i][0]++; }else if(s[i+2]=='e'&&s[i]=='e') { s[i]='d'; dp[i][0]++; } dp[i][1]=0; continue; } dp[i][0]=dp[i-1][0]; dp[i][1]=dp[i-1][1]; if(i%3==0) { if(s[i+2]=='d'&&s[i]!='r') { s[i]='r'; dp[i][0]++; }else if(s[i+2]=='r'&&s[i]!='d') { s[i]='d'; dp[i][0]++; }else if(s[i+2]=='e'&&s[i]=='e') { s[i]='d'; dp[i][0]++; } if(rs[i-2]=='d'&&rs[i]!='r') { rs[i]='r'; dp[i][1]++; }else if(rs[i-2]=='r'&&rs[i]!='d') { rs[i]='d'; dp[i][1]++; } dp[i][1]=min(dp[i][1] , dp[i-1][0]); }else if(i%3==1) { if(s[i]!='e') dp[i][0]++; if(rs[i+2]=='d'&&rs[i]!='r') { rs[i]='r'; dp[i][1]++; }else if(rs[i+2]=='r'&&rs[i]!='d') { rs[i]='d'; dp[i][1]++; }else if(rs[i+2]=='e'&&rs[i]=='e') { rs[i]='d'; dp[i][1]++; } }else if(i%3==2) { if(rs[i]!='e') dp[i][1]++; if(s[i-2]=='d'&&s[i]!='r') { s[i]='r'; dp[i][0]++; }else if(s[i-2]=='r'&&s[i]!='d') { s[i]='d'; dp[i][0]++; } } } cout<<dp[slen-1][1]<<endl; }else if(flag==3) { for(int i=0;i<slen;i++) { if(i==0) { if(s[i+2]=='d'&&s[i]!='r') { s[i]='r'; dp[i][0]++; }else if(s[i+2]=='r'&&s[i]!='d') { s[i]='d'; dp[i][0]++; }else if(s[i+2]=='e'&&s[i]=='e') { s[i]='d'; dp[i][0]++; } dp[i][1]=0; dp[i][2]=0; continue; } dp[i][0]=dp[i-1][0]; dp[i][1]=dp[i-1][1]; dp[i][2]=dp[i-1][2]; if(i%3==0) { if(ts[i]!='e') dp[i][2]++; if(s[i+2]=='d'&&s[i]!='r') { s[i]='r'; dp[i][0]++; }else if(s[i+2]=='r'&&s[i]!='d') { s[i]='d'; dp[i][0]++; }else if(s[i+2]=='e'&&s[i]=='e') { s[i]='d'; dp[i][0]++; } if(rs[i-2]=='d'&&rs[i]!='r') { rs[i]='r'; dp[i][1]++; }else if(rs[i-2]=='r'&&rs[i]!='d') { rs[i]='d'; dp[i][1]++; } dp[i][1]=min(dp[i][1] , dp[i-1][0]); }else if(i%3==1) { if(s[i]!='e') dp[i][0]++; if(rs[i+2]=='d'&&rs[i]!='r') { rs[i]='r'; dp[i][1]++; }else if(rs[i+2]=='r'&&rs[i]!='d') { rs[i]='d'; dp[i][1]++; }else if(rs[i+2]=='e'&&rs[i]=='e') { rs[i]='d'; dp[i][1]++; } if(ts[i-2]=='d'&&ts[i]!='r'&&i>2) { ts[i]='r'; dp[i][2]++; }else if(ts[i-2]=='r'&&ts[i]!='d'&&i>2) { ts[i]='d'; dp[i][2]++; } dp[i][2]=min(dp[i][2] , dp[i-1][1]); }else if(i%3==2) { if(rs[i]!='e') dp[i][1]++; if(s[i-2]=='d'&&s[i]!='r') { s[i]='r'; dp[i][0]++; }else if(s[i-2]=='r'&&s[i]!='d') { s[i]='d'; dp[i][0]++; } if(ts[i+2]=='d'&&ts[i]!='r') { ts[i]='r'; dp[i][2]++; }else if(ts[i+2]=='r'&&ts[i]!='d') { ts[i]='d'; dp[i][2]++; }else if(ts[i+2]=='e'&&ts[i]=='e') { ts[i]='d'; dp[i][2]++; } } } // for(int i=0;i<slen;i++) cout<<dp[i][0]<<" "; cout<<endl; // for(int i=0;i<slen;i++) cout<<dp[i][1]<<" "; cout<<endl; // for(int i=0;i<slen;i++) cout<<dp[i][2]<<" "; cout<<endl; cout<<dp[slen-1][2]<<endl; } return 0; }
//B题 #include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; const int N=1e5+7; int a[N]; signed main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int maxn1=-1 , maxn2=-1; for(int i=1;i<=n;i++) { if(!(i%2)) maxn2=max(maxn2 , a[i]); if(i%2) maxn1=max(maxn1 , a[i]); } int ans=0; for(int i=1;i<=n;i++) { if(!(i%2)) ans+=maxn2-a[i]; if(i%2) ans+=maxn1-a[i]; } cout<<ans<<endl; return 0; }
//C题 #include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; const int MAXN=0x3f3f3f3f3f3f3f3f; const int N=1e6+7; int a[N]; int b[N]; int res=0; int get(int n){return (int)log10(n)+1;} map<string , bool>mp; map<string , bool>mp2; void dfs_a(string s) { int slen=s.length(); if(slen==1) return; for(int i=0;i<slen;i++) { string s2=s; s2.erase(s2.begin()+i); if(mp[s2]==0) { mp[s2]=1; // cout<<res<<endl; a[++res]=stoi(s2); dfs_a(s2); } } } int mnt=0; void dfs_b(string s) { int slen=s.length(); if(slen==1) return; for(int i=0;i<slen;i++) { string s2=s; s2.erase(s2.begin()+i); if(mp2[s2]==0) { b[++mnt]=stoi(s2); mp2[s2]=1; dfs_b(s2); } } } signed main() { string sa , sb; cin>>sa>>sb; res=0 , mnt=0; a[0]=stoi(sa); b[0]=stoi(sb); dfs_a(sa); dfs_b(sb); int ans=MAXN , flag=0; for(int i=0;i<=res;i++) { for(int j=0;j<=mnt;j++) { if(a[i]==0||b[j]==0) ans=min(ans , get(a[0])-get(a[i])+get(b[0])-get(b[i])); else if((a[i]%b[j]==0)||(b[j]%a[i]==0)) ans=min(ans , get(a[0])-get(a[i])+get(b[0])-get(b[j])); } } // cout<<res<<endl; // for(int i=0;i<=res;i++) cout<<a[i]<<" ";cout<<endl; // for(int i=0;i<=mnt;i++) cout<<b[i]<<" ";cout<<endl; // cout<<cnt<<" "<<mnt<<endl; if(ans==MAXN) cout<<-1<<endl;else cout<<ans<<endl; // cout<<ans<<endl; return 0; }
//D题 #include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; const int N=1e5+7; int a[N] , b[N] , c[N]; int n , cnt=0; map<int , int>mp; void discrete() { sort(a+1 , a+n+1); for(int i=1;i<=n;i++) { if(i==1||a[i]!=a[i-1]) b[++cnt]=a[i]; } } int query(int x){return lower_bound(b+1 , b+cnt+1 , x)-b;} struct SegmentTree { int p , l , r; int real_num; int all; int num; };SegmentTree trie[N<<2]; void build(int p , int l , int r) { trie[p].l=l , trie[p].r=r; if(l==r) { trie[p].all=mp[l]; return; } int mid=(l+r)>>1; build(p<<1 , l , mid); build(p<<1|1 , mid+1 , r); trie[p].num=trie[p<<1].num+trie[p<<1|1].num; } void change(int p , int x) { if(trie[p].l==trie[p].r) { trie[p].real_num++; trie[p].num=(trie[p].all-trie[p].real_num)*trie[p].real_num; return; } int mid=(trie[p].l+trie[p].r)>>1; if(x<=mid) change(p<<1 , x); else change(p<<1|1 , x); trie[p].num=trie[p<<1].num+trie[p<<1|1].num; } int sum=0; void ask(int p , int L , int R) { if(trie[p].l>=L&&trie[p].r<=R) { sum+=trie[p].num; return; } int mid=(trie[p].l+trie[p].r)>>1; if(L<=mid) ask(p<<1 , L , R); if(R>mid) ask(p<<1|1 , L , R); } signed main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; c[i]=a[i]; } cnt=0; discrete(); for(int i=1;i<=n;i++) mp[query(c[i])]++; build(1 , 1 , cnt); // cout<<cnt<<"--"<<endl; int ans=0; for(int i=1;i<=n;i++) { sum=0; ask(1 , query(c[i])+1 , cnt); ans+=sum; // cout<<sum<<endl; change(1 , query(c[i])); } cout<<ans<<endl; return 0; }
一句话题解:
A题:就是简单的逻辑dp,dp[i][j]表示修改到第i个字符,可跳过j个字符情况的最优ans ,我觉得难点就在写的麻烦。。思路挺明了的。时间复杂度o(n) B题cf*800:跑两个最大值就出来了,奇数位和偶数位最大值,也是一种贪心吧算是,不细说了,看到做法就应该明白了。时间复杂度o(n)
C题:纯dfs暴力,dfs出所有可能出现的字符串(我加了个去重怕超时实际好像不用)时间复杂度o(2的slen-1次方(由组合定理可知))
D题:权值线段树板子题,离散化 ,建立空树,出现一个数插入一个数,维护数字的出现次数,未出现次数以及总个数,查询的时候找某个数字比他大的数字的出现过的次数*未出现过的次数的和就可以了时间复杂度o(nlogn);
D题:权值线段树板子题,离散化 ,建立空树,出现一个数插入一个数,维护数字的出现次数,未出现次数以及总个数,查询的时候找某个数字比他大的数字的出现过的次数*未出现过的次数的和就可以了时间复杂度o(nlogn);