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

查看14道真题和解析