笔试总共三道编程题,在牛客网上考,难度都不高,已知的编程题题题库有四道,不过牛客网上没有公布全部的编程题,本文只写我遇到的三道。
第一题,给出三个数x,y,z,两种操作,一种是任取两个数字都加1,一种是取一个数字+2,求最少多少次操作使得三个数字相等。
思路:排序,看较小的两个数与最大的数的差值,1、差值均为偶数,直接 差值/2 求和;2、差值均为奇数,两个数+1(差值均-1),然后/2 求和,3、一奇一偶,差为偶数的数与最大的数均加1,然后差值均为偶数 /2 +1
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int a[4];
cin>>a[0]>>a[1]>>a[2];
sort(a,a+3);
int x1,x2;
x1 = a[2]-a[0];
x2 = a[2]-a[1];
int ans=0;
if(x1%2==0&&x2%2==0){
ans += x1/2;
ans += x2/2;
}
else if(x1%2==1&x2%2==1){
ans+=1;
x1-=1;
x2-=1;
ans += x1/2;
ans += x2/2;
}
else{
ans+=2;
ans += x1/2;
ans += x2/2;
}
cout<<ans<<endl;
return 0;
}
第二题,扑克牌洗牌,给出13张扑克牌,扑克牌有对应的点数,进行n次洗牌,洗牌为分成随机的左右两堆,从左边拿一张,再从右边拿一张放在前一张上面,再从左边拿一张放在上面,重复至一堆为空,若另一堆不为空,全部放上去。给出每次洗牌时其中一堆的数量,问洗牌后的卡牌点数顺序。
小模拟,就用一个数组存卡牌拿出来的顺序,然后倒序存回去,重复n次
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int card[14],tmp[14];
int main(){
int n;
for(int i=0;i<13;i++){
cin>>card[i];
}
int l,r;
cin>>n;
int cnt=0;
int p;
while(n--){
cnt = 0;
p=0;
cin>>l;
r = 13-l;
while(l&&r){
tmp[cnt++]=card[l-1];
tmp[cnt++]=card[12-p];
l--;
r--;
p++;
}
while(l){
tmp[cnt++]=card[l-1];
l--;
}
while(r){
tmp[cnt++]=card[12-p];
r--;
p++;
}
/*
for(int i=0;i<13;i++){
printf("%d ",tmp[i]);
}
cout<<endl;
*/
for(int i=0;i<13;i++){
card[i]=tmp[12-i];
}
}
for(int i=0;i<12;i++){
printf("%d ",card[i]);
}
cout<<card[12]<<endl;
return 0;
}
/*
1 2 3 4 5 6 7 8 9 10 11 12 13
2
6 1
*/
第三题,n种糖果,每种糖果无限个,某人想用这些糖果选m个放入盒子里,其中每种糖果都有最少选用l[i]和最大选用r[i],问有多少种选择方法。
思路:实际上问题可以化简,m-=l[i], num[i]=r[i]-l[i],问题变为n种糖果,每个有num[i]个,问从中选m个的方法,这是标准的二维dp ,多重集组合数
dp[i][j] 前i种选j个的 方法数,
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
LL n,m;
LL dp[100][105];
LL l[22],h[22];
LL num[22];
int main(){
cin>>n>>m;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
cin>>l[i]>>h[i];
m-=l[i];
num[i]=h[i]-l[i];
}
for(int i=0;i<=n;i++){
dp[i][0]=1;
}
for(int i=0;i<n;i++){
for(int j=1;j<=m;j++){
if(j>num[i]){
dp[i+1][j] = (dp[i][j] + dp[i+1][j-1] - dp[i][j-1-num[i]] );
}
else{
dp[i+1][j] = dp[i][j] + dp[i+1][j-1];
}
}
}
cout<<dp[n][m]<<endl;
return 0;
}