题解:AT_abc200_d [ABC200D] Happy Birthday! 2

提供一个新的做法。

创建一个长度为 \(200\) 的 vector 数组 \(dp\)(名字瞎取的),遍历每个值,然后复制一个 \(tmp\gets dp\),遍历从 \(0\)\(199\) 的每个存在的 \(sum\),如果 \(tmp_{sum}\) 不为空,就新建一个 \(newsum\gets sum+a_i\),如果 \(dp_{newsum}\) 不为空且 \(dp_{newsum}\ne tmp_{sum}\),就找到了,输出,如果 \(dp_{newsum}\) 不存在,就将 \(dp_{newsum}\) 添加进去。

注意每次遍历时还要看 \(a_i\) 本身能不能满足要求。

代码:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int N;
    cin >> N;
    vector<long long> A(N);
    for(auto &x: A) cin >> x;
    vector<vector<int>> dp(200, vector<int>());
    for(int i=0; i<N; ++i){
        vector<vector<int>> temp_dp = dp;
        // 遍历所有可能的和
        for(int sum=0; sum<200; ++sum){
            if(!temp_dp[sum].empty()){
                int new_sum = (sum + (A[i] % 200)) % 200;
                if(!dp[new_sum].empty()){
                    vector<int> existing_subset = dp[new_sum];
                    vector<int> new_subset = temp_dp[sum];
                    new_subset.push_back(i+1);
                    if(existing_subset != new_subset){
                        cout << "Yes\n";
                        cout << existing_subset.size();
                        for(auto idx: existing_subset) cout << " " << idx;
                        cout << "\n";
                        cout << new_subset.size();
                        for(auto idx: new_subset) cout << " " << idx;
                        cout << "\n";
                        return 0;
                    }
                }
                else{
                    dp[new_sum] = temp_dp[sum];
                    dp[new_sum].push_back(i+1);
                }
            }
        }
        int sum_i = A[i] % 200;
        if(!dp[sum_i].empty()){
            vector<int> existing_subset = dp[sum_i];
            vector<int> new_subset = {i+1};
            if(existing_subset != new_subset){
                cout << "Yes\n";
                cout << existing_subset.size();
                for(auto idx: existing_subset) cout << " " << idx;
                cout << "\n";
                cout << new_subset.size();
                for(auto idx: new_subset) cout << " " << idx;
                cout << "\n";
                return 0;
            }
        }
        else{
            dp[sum_i] = {i+1};
        }
    }
    cout << "No\n";
    return 0;
}
posted @ 2024-12-01 11:48  cly312  阅读(3)  评论(0)    收藏  举报