ECNU计科复试机试(2021)

C.子序列

#include 
#include 
#include 
#include 

using namespace std;

#define DEBUG 0


vector<long long> Num;
vector<int> dp;
long long Sum = 0;

int main(){
    int n;
    long long S;    //序列和
    int a1,b;
    cin >> n >> S >> a1 >> b;
    Num.push_back(0);
    Num.push_back(a1);
    dp.push_back(n);
    dp.push_back(n);
    Sum += a1;
    for(int i = 2; i <= n; ++i){
    	int current_num = (b * Num[i-1]) % (int(1e9) + 7);
        Num.push_back(current_num);
        Sum += current_num;
        dp.push_back(n);
    }
    if(Sum < S){
        cout << -1 << endl;
        return 0;
    }

    //dp
    long long current_sum = Sum;
    int len_tiqian = 1;
    for(int i = n; i >= 1; --i){
        if(current_sum >= S){
            for(int j = len_tiqian; j < i; ++j){
                current_sum -= Num[j];
                if(current_sum >= S){
                    dp[i]--;
                } else {
                    current_sum += Num[j];  //退回
                    len_tiqian = j;
                    break;
                }
            }
        } else {
            for(int j = len_tiqian - 1; j >= 1; j--){
                current_sum += Num[j];
                dp[i]++;
                if(current_sum >= S){
                    break;
                }
            }
            if(current_sum < S){
                dp[i] = dp[i+1];    //防止边界问题
                break;
            }
        }
        dp[i-1] = dp[i] - 1;        //状态转移
        current_sum -= Num[i];
    }


    sort(dp.begin()+1,dp.end());
    cout << dp[1] << endl;

    #if DEBUG
    for(int i = 1; i <= n; ++i){
        cout << Num[i] << " ";
    }
    cout << endl;
    for(int i = 1; i <= n; ++i){
        cout << dp[i] << " ";
    }
    cout << endl;
    #endif

    return 0;
}

你可能感兴趣的:(ECNU复试机试,动态规划,c++,算法)