2021 Examen de ingreso de posgrado en informática Fudan

  1. La primera pregunta
    (el árbol que construí manualmente, emmmmm, es un poco tosco. Puedes ver la idea)
#include<iostream>
#include<vector>

using namespace std;

struct TreeNode
{
    
    
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
    
    }
    
};

//  返回的答案
int ans;

void dfs(TreeNode* root, int target){
    
    
    if(!root) return;
    if(root->val >= target) ans++;

    // 选取最大值并传递下去
    dfs(root->left, max(target, root->val));
    dfs(root->right, max(target, root->val));
}

int solution(TreeNode* root){
    
    
    if(!root) return 0;
    dfs(root, root->val);
    return ans;
}

int main(){
    
    
    
    TreeNode* t1 = new TreeNode(100);
    TreeNode* t2 = new TreeNode(80);
    TreeNode* t3 = new TreeNode(70);
    TreeNode* t4 = new TreeNode(3);
    TreeNode* t5 = new TreeNode(4);

    t1->left = t2;
    t1->right = t3;
    
    t2->left = t4;
    t2->right = t5;

    cout << "Answer is : " << solution(t1) << endl;
    system("pause");
    return 0;
}
  1. Segunda pregunta
#include<iostream>
using namespace std;



// 本题是一个斐波那契数列数列问题
// 经典  f(n) = f(n-1) + f(n-2) 问题
// 本题可以使用递归结构来做,但是空间效率很低,而且容易超时
// 迭代方法效率更高
int solution(int n){
    
    

    // 特殊情况考虑
    if(n == 1 || n == 0) return 1;
    int a = 1, b = 1, ans = 0, i = 0;

    while(i <= n -2){
    
    
        // int 类型防止溢出
        ans = (a + b) % 1000000007;
        b = a;
        a = ans;
        i++;
    }

    return ans;
}

int main(){
    
    
    int n;
    cin >> n;
    cout << "Answer is : "<< solution(n) <<endl;
    system("pause");
    return 0;
}
  1. Tercera pregunta
#include<iostream>
#include<vector>
using namespace std;

/*
 题目分析:期望值为 E,数组(非负)总和为 sums
 设结果中的所有正数和为A,所有负数绝对值和为B,那么 E = A-B
 而 sums = A+B
 则有:A = (sums + E)/2
 sums与E都是已知的,将问题转化为:在数组中取几个数,使得其和为 A。
 按照背包问题套路解决。 
*/

int solution(vector<int>& nums, int E){
    
    
    int sums = 0;
    for(auto i : nums) sums += i;
    if(sums < E) return 0;

    // sums 与 E 都是整数,按照分析,那么 A 也应该是整数,如果 A 非整数证明不存在满足等式的整数 A,没有答案。
    if((sums + E) % 2 == 1) return 0;

    int A = (sums + E) / 2;

    vector<int> dp(A + 1, 0);
    dp[0] = 1;

    // 背包问题求组合数,外层遍历物品,内层遍历背包
    for(auto i : nums){
    
    
        for(int j = A; j >= i; j--){
    
    
            dp[j] += dp[j - i];
        }
    }
    return dp[A];
}


int main(){
    
    

    int n, E;

    cin >> n;
    cin >> E;
    vector<int> nums(n, 0);
    for(int i = 0; i < n; i++) cin >> nums[i];

    cout << "Answer is: " << solution(nums, E) << endl;

    system("pause");
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43078427/article/details/115304771
Recomendado
Clasificación