首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信zhuastor@gmail.com
解題心得
覺得自己算遞迴的時間很弱,還需加強,想了很久才想到更好的窮舉方法。
解題想法
我一開始的想法是遞迴三次”平均數”窮舉所有數字的可能組合,然後中間做一些小技巧加快時間,不過有20分TLE了。後來換個角度想,如果從每個物品去窮舉他會在誰身上,這樣既可以保證可以找到正確情況,時間又大幅縮減。
想到這方法的時候還笨笨的覺得,不對這一定會花很久的時間,結果過一段時間想到不然log算一下,然後發現超快。
AC code
#include<bits/stdc++.h>
using namespace std;
int n,aver,maxd=0;
double check;
int a[20];
int ans[3];
bool ta;
void dfs(int index){
if(ta)return;
if(index==n){
if(ans[0]==ans[1] && ans[1]==ans[2]){
cout << "YES" << endl;
ta=true;
}
return;
}
for(int x=0;x<3;x++){
if(ans[x]+a[index]<=aver){
ans[x]+=a[index];
dfs(index+1);
ans[x]-=a[index];
}
}
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin >> n;
for(int x=0;x<n;x++){
cin >> a[x];
aver+=a[x];
maxd=max(maxd,a[x]);
}
check=aver/3;
aver/=3;
if(check==aver){
if(maxd>aver)cout << "NO" << endl;
else{
dfs(0);
if(!ta)cout << "NO" << endl;
}
}
else{
cout << "NO" << endl;
}
return 0;
}
題目連結 : TOI練習賽2020年4月潛力組