题解: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;
}

浙公网安备 33010602011771号