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);

