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

全部评论
第一题负数的情况应该就相当于正数的情况的答案相对于3取反,所以两个样例的答案相加为0。 第二题S很大,所以显然不是dp,感觉可以求个前缀和再用双指针,O(n)。
点赞 回复 分享
发布于 2024-06-27 16:14 上海
感谢分享~
点赞 回复 分享
发布于 2023-03-27 11:56 上海
华师的复试题目出了吗
点赞 回复 分享
发布于 2023-03-15 09:48 山东
这是真大佬啊
点赞 回复 分享
发布于 2023-03-15 09:45 江苏

相关推荐

点赞 评论 收藏
分享
爱喝奶茶的垂耳兔拥抱太阳:感觉项目和实习没有技术亮点和难点,单纯说了自己干了啥
点赞 评论 收藏
分享
评论
2
7
分享

创作者周榜

更多
牛客网
牛客企业服务