P9714 「QFOI R1」摸摸

#include
using namespace std;
using VI = vector;
using ll = long long;
using PII = pair ;


void solve(){
    int n;
    cin>>n;
    VI s(n+1) , t(n+1) , b(n+1) , a(n+1);
    for(int i = 1 ; i <= n ; i++) cin>>t[i];
    for(int i = 1 ; i <= n ; i++) cin>>b[i];
    for(int i = 1 ; i <= n ; i++) s[i] = t[i] + t[n-i+1];
    
    int step = 2000;
    //bool ok = false;
    for(int i = 0 ; i <= step ; i++){
        for(int j = 1 ; j <= n ; j++){
            a[j] = i * t[j];
            if(a[j] > b[j]){
                cout<<"NO\n";
                return;
            }
        }

        int tt = -1;
        bool ok = true;
        for(int j = 1 ; j <= n ; j++){
            int d = b[j] - a[j];
            if(d % s[j] != 0) {
                ok = false;
                break;
            }
            if(tt == -1 || d / s[j] == tt){
                //cout<>t;
    while(t--){
        solve();
    }

}

本质上来说好像就是个枚举的题目

首先操作1 会将整个数组变成一个回文数组 , 变成一个回文数组后 进行两次操作2 和 进行一次操作1 + 2  是等效的

所以我们只需要考虑何时进行这次操作 观察到 b 不超过 2000 ,也就是最多也就进行2000次操作

在进行操作1后 就只需验证剩下的操作能否成功 

你可能感兴趣的:(基本算法,思维构造,算法,c++,数据结构)