Zerojudge f168

首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信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月潛力組