CodeForce #319 div 2 B Modulo sum

来源:互联网 发布:sql delete in select 编辑:程序博客网 时间:2024/05/22 02:17

为了熟悉c++开始刷题。

需要注意这道题不用开大数组直接存dp就可以做了。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<set>#include<vector>using namespace std;int x;bool dp[1000], dp_[1000];int n, m;int main(){    scanf("%d%d",&n,&m);    memset(dp,false,1000);    memset(dp_,false,1000);    for(int i = 0; i < n; i++)    {        scanf("%d", &x);        if(dp[0]) break;        for(int j = 0; j < m; j++ )        {            if(dp_[j])            {                dp[(j+x)%m] = true;            //  cout<<(j+x)%m<<" at the time of "<< i<< endl;            }        }               dp[x%m] = true;        memcpy(dp_,dp,sizeof(dp));    }    if(dp[0]) cout<<"YES";    else cout<<"NO";    return 0;}
感觉明明是O(mn)的大小,跑起来却特别快。不理解。

自己用set也做了一遍。
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<set>#include<vector>using namespace std;int x;set<int> g;vector<int> v;int n, m;int main(){    scanf("%d%d",&n,&m);    bool find = false;           for(int i = 0; i < n; i++)    {     scanf("%d", &x);//      cout<<"size of "<<i <<" "<<g.size()<<"time for "<<a[i]<<endl;        if(g.find(0)!=g.end()) break;    //  cout<<"size of "<<i <<" "<<g.size()<<endl;        int size = v.size(), t;        bool tmp;        for(int j = 0; j<size; j++)        {            t = (v[j]+x)%m;            tmp = g.find(t) !=g.end();//          cout<< "iterator "<< *j<<endl;            if(!tmp)    v.push_back((v[j]+x)%m);            g.insert((v[j]+x)%m);        //  cout<<*j<<" "<<(*j+a[i])%m<<endl;        }           t = x%m;        tmp = g.find(t)!=g.end();        if(!tmp) v.push_back(t);            g.insert(t);//      cout<<a[i]<<endl;    }    if(g.find(0)!=g.end()) cout<<"YES";    else cout<<"NO";    return 0;}
差不多是O(NMlogM)吧。理解了。
0 0