总述
总分: 290;
排名: 3;
A题数: 2。
题目
T1-面试
题目
考试分数:100
分析
- 首先,这是一道比较简单的题目,类似于桶排;
- 其次,要注意判断条件,不要弄混。
做法
核心code环节
//储存答案
string ans[4]=
{
"zhuAC",
"failed",
"offer",
"sp offer"
};
//处理方法(在线)
for(int i=0;i<s.size();i++) {
if(s[i]=='A') num[1]++;
else if(s[i]=='B') num[2]++;
else if(s[i]=='C') num[3]++;
else num[4]++;
}
if(num[4]!=0 || num[3]>=2) cout<<ans[1]<<endl;
else if(num[4]==0 && num[1]>=3) cout<<ans[3]<<endl;
else cout<<ans[2]<<endl;
坑点
- 要清空计数器;
- 要写好判断条件。
T2-Excel计数法
题目
考试分数:50
分析
- 首先,这是一道比较隐蔽的进制转换题(26进制);
- 其次,为了方便,我们要像上一题一样储存答案;
- 最后,要处理好字母Z。
做法
核心code环节
//储存,注意Z在0的位置
char s1[27]=
{
'Z','A','B','C','D','E','F','G',
'H','I','J','K','L','M','N',
'O','P','Q','R','S','T',
'U','V','W','X','Y'
};
//处理过程
string ans;
while(n) {
ans=s1[n%26]+ans;//因为是从个位开始,所以应添加在前面,相当于逆序输出。
int p=n;
n/=26;
if(p%26==0) n--;//是26的倍数,如果不减1,以后会一直为 Z。
}
坑点
- 处理字母Z;
p%26==0
的情况;- 逆序。
T3-纸牌游戏
题目
考试分数:100
分析
- 首先,这是一道贪心题;
- 其次,我们思考:怎样才能让留下的人尽可能多?当然是每个人取牌都取剩余牌数最少的人,这样的话我们只需再输入完后 s o r t sort sort一下就好;
- 最后,我们思考:怎么判断游戏能不能继续?因为
s
o
r
t
sort
sort了,所以第
i
i
i个人的牌一定小于第
i
+
1
i+1
i+1个人的牌。这样,如果第
i
i
i各人剩余的牌数如果大于
n-i
,那就说明就算后面n-i
个人都拿了第 i i i个人的牌,这个人也不会被淘汰。这样就可以求出答案为:n-i+1
。
做法
核心code环节
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) {
if(a[i]>=n-i) {//因为已经排序,所以如果这一句成立,说明就算第a[i]个人的牌被后面的人拿了,也能再自己拿回来。后边的人就会无限进行游戏。
printf("%d",n-i+1);
return 0;
}
}
坑点
本题的坑点只有一个:
s
o
r
t
sort
sort。
T4-涨薪
题目
考试分数:40
分析
- 首先,这是一道考察贪心+快速幂的题;
- 其次,因为要 m m m年后发出的工资最多,所以应让当前工资更高的人领 x x x、 y y y的名额;
- 最后,如果 m m m等于1,那就要加上 C C C等级的工资。
做法
核心code环节
//快速幂
long long digui(long long a,long long b) {
if(b==0) return 1;
if(b%2==1) return (a*digui(a,b-1))%mod;
else return (digui(a,b/2)*digui(a,b/2))%mod;
}
//从大到小排序
sort(a+1,a+n+1);
reverse(a+1,a+n+1);
//处理过程
for(int i=1;i<=x;i++) {//x个人工资每年翻三倍
ans=ans+digui(3,m)*a[i];
ans=ans%mod;
}
for(int i=x+1;i<=x+y;i++) {//y个人工资每年翻两倍
ans=ans+digui(2,m)*a[i];
ans=ans%mod;
}
if(m==1)
for(int i=x+y+1;i<=n;i++) {//因为剩下的人在第二年就会被开除,所以只有当m=1时要加上他们的工资。
ans=ans+a[i];
ans=ans%mod;
}
坑点
本题的坑点只有一个:剩下的人只有在第一年会结算工资。
T5-富有数
题目
考试分数:0
分析
- 首先,这是一道dp+map的题目;
- 其次,因为题目中数字最大到 1 0 9 10^9 109,所以应用离散化或者map来记录次数;
- 最后,献上状态转移公式: d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] ∗ m p [ a [ i ] ] + d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j-1]*mp[a[i]]+dp[i-1][j] dp[i][j]=dp[i−1][j−1]∗mp[a[i]]+dp[i−1][j]。
做法
核心code环节
for(int i=1;i<=ans;i++) {
for(int j=1;j<=i;j++) {
dp[i][j]=dp[i-1][j]+dp[i-1][j-1]*mp[a[i]];
}
}
坑点
本题的坑点就是处理富有数的个数。