(随机算法)洛谷P1356 数列的整除性

一、算法分析

随机算法的核心就是随机(感觉像说了句废话)。但是当随机的次数足够多的时候,往往能够在很高的几率上“碰”到正确答案。基本框架是随机进行决策,然后生成结果。注意,随机算法往往是决策随机而不是每次生成的结果随机,结果还是要保证是合法结果的,比如本题每次虽然加减是随机进行的,但是结果都是合法结果,再此基础上,再去判断是否可以被k整除。

二、代码及注释

//随机算法
#include
#include
#include
#include
using namespace std;
const int N=10050;
int w[N];

int main(){
    
    int T;
    cin>>T;
    while(T--){
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++) scanf("%d",&w[i]);
        int tests=666;                            //取一个吉利的数字
        int ok=0;
        while(tests--){
            int sum=0;
            for(int i=1;i<=n;i++){
                int randd=rand();
                if(randd & 1) sum+=w[i];          //基本思路很简单,用取的随机数随机加减(可以设置为奇数加偶数减)即可
                else sum-=w[i];
            }
            if(sum%k==0){ok=1;break;}
        }
        if(ok) cout<<"Divisible"<<endl;
        else cout<<"Not divisible"<<endl;
    }
    
    
    
    return 0;
    
}

你可能感兴趣的:(细节处理)