2021年 ECNU计科考研复试机试
本次机试共4题,不直接将分数计入成绩,仅在面试时用于参考。
A. 平衡三进制II
代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> h10Toh3(int x){
vector<int> res;
while(x!=0){
res.push_back(x%3);
x=x/3;
}
return res;
}
int Count3n(int x){
int count=0;
while(x!=1){
count++;
x=x/3;
}
return count;
}
int main(){
int a,b;
cin>>a>>b;
int count= Count3n(b);
vector<int> res= h10Toh3(a);
int ci=0;
for(int i=0;i<res.size();i++){
int t=res[i];
res[i]=(t+1+ci)%3;
ci=(t+1+ci)/3;
}
if(ci!=0) res.push_back(ci+1);
for(int i=0;i<res.size();i++){
if(res[i]-1==-1) res[i]=2;
else res[i]=res[i]-1;
}
reverse(res.begin(),res.end());
int pos=0;
while(res[pos]==0) pos++;
res.erase(res.begin(),res.begin()+pos);
for(int i=0;i<res.size()-count;i++) cout<<res[i];
if(count!=0){
cout<<".";
int pos2=res.size()-1;
while(res[pos2]==0) pos2--;
for(int i=res.size()-count;i<=pos2;i++)
cout<<res[i];
}
}
上述代码只能实现70%的数据,A为负数的部分短时间想不出。
C. 子序列
代码:
类似背包问题,动态规划的思想写的,但是数组开不到题目要求那么大……
#include <iostream>
using namespace std;
const int MAXN=10001;
int a[MAXN];
int dp[MAXN][MAXN];
int main(){
int n,s,a1,b;
cin>>n>>s>>a1>>b;
for(int i=1;i<=n;i++){
if(i==1) a[i]=a1;
else a[i]=(a[i-1]*b)%1000000007;
}
for(int i=0;i<=n;i++)
for(int j=0;j<=s;j++){
if(j==0) dp[i][j]=0;
else dp[i][j]=-1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=s;j++){
if(j-a[i]<=0) dp[i][j]=1;
else if(dp[i-1][j]!=-1 && dp[i-1][j-a[i]]!=-1)
dp[i][j]=min(dp[i-1][j],dp[i-1][j-a[i]]+1);
else if(dp[i-1][j]!=-1 && dp[i-1][j-a[i]]==-1)
dp[i][j]=dp[i-1][j];
else if(dp[i-1][j]==-1 && dp[i-1][j-a[i]]!=-1)
dp[i][j]=dp[i-1][j-a[i]]+1;
}
}
/*for(int i=0;i<=n;i++){
for(int j=0;j<=s;j++)
cout<<dp[i][j]<<" ";
cout<<endl;
}*/
cout<<dp[n][s]<<endl;
}
不好做,不想写啦TAT
查看10道真题和解析