poj 3187

来源:互联网 发布:时尚软件app排行榜 编辑:程序博客网 时间:2024/05/24 05:52
这是我对POJ怨念最深的一道题。。。。
#include<stdio.h>#include<string.h>#define INF 1000000int x[745];int n,sum;void swap(int& a,int& b){    int t;    t=a;    a=b;    b=t;    return;}int findmaxj(int a){    int i;    int k;    int mine;    mine=INF;    k=-1;    for(i=a;i<(n-1);i++){        if(x[a]<x[i+1]&&x[i+1]<mine){            k=i+1;            mine=x[k];            }   }   return k;}int findj(){    int i;    int j;    for(i=(n-2);i>=0;i--){        if(x[i]<x[i+1]){            j=i;            return j;        }    }    return 0;}void rest(int j){    int v,p;    v=(n-j+1)/2;   for(p=0;p<v;p++){       swap(x[j+p],x[n-1-p]);   }   return;}void change(){    int minj,maxj;    minj=findj();    maxj=findmaxj(minj);    swap(x[minj],x[maxj]);    rest(minj+1);    return;}int sumn(int k,int l){    int i;    int e;    e=1;    for(i=0;i<k;i++){        e=e*l;        l--;    }    return e;}int qwe(int a,int b){    int e;    if(a==0||a==n-1){        return 1;    }    else{        e=sumn(a,b)/sumn(a,a);    }    }int finalsum(){    int r=0;    int u;    for(u=0;u<n;u++){        r+=x[u]*qwe(u,n-1);    }    return r;}int sloution(){    int u;    int e;    int g;    e=sumn(n,n);    for(u=0;u<e;u++){        g=finalsum();        if(g==sum){            return 1;        }        change();    }    return 0;}int main(){    scanf("%d %d",&n,&sum);    if(n>10)    return 0;    int i,h;    memset(x,0,sizeof(x));    for(i=0;i<n;i++){        x[i]=i+1;    }    h=sloution();    if(h==0)   return 0;    for(i=0;i<n;i++){        printf("%d ",x[i]);    }      return 0;}

我对以上代码改了一个星期。。。就是不知道错在哪。。。。

以下是AC了的代码,,大家有兴趣就来找找不同吧。。。

#include<stdio.h>#include<string.h>#define INF 1000000int x[745];int n,sum;void swap(int& a,int& b){    int t;    t=a;    a=b;    b=t;    return;}int findmaxj(int a){    int i;    int k;    int mine;    mine=INF;    k=-1;    for(i=a;i<(n-1);i++){        if(x[a]<x[i+1]&&x[i+1]<mine){            k=i+1;            mine=x[k];            }   }   return k;}int findj(){    int i;    int j;    for(i=(n-2);i>=0;i--){        if(x[i]<x[i+1]){            j=i;            return j;        }    }    return 0;}void rest(int j){    int v,p;    v=(n-j+1)/2;   for(p=0;p<v;p++){       swap(x[j+p],x[n-1-p]);   }   return;}void change(){    int minj,maxj;    minj=findj();    maxj=findmaxj(minj);    swap(x[minj],x[maxj]);    rest(minj+1);    return;}int sumn(int k,int l){    int i;    int e;    e=1;    for(i=0;i<k;i++){        e=e*l;        l--;    }    return e;}int qwe(int a,int b){    int e;    if(a==0||a==n-1){        return 1;    }    else{        e=sumn(a,b)/sumn(a,a);    }    return e;}int finalsum(){    int r=0;    int u;    for(u=0;u<n;u++){        r+=x[u]*qwe(u,n-1);    }    return r;}int sloution(){    int u;    int e;    int g;    e=sumn(n,n);    for(u=0;u<e;u++){        g=finalsum();        if(g==sum){            return 1;        }        change();    }    return 0;}int main(){    scanf("%d %d",&n,&sum);    if(n>10)    return 0;    int i,h;    memset(x,0,sizeof(x));    for(i=0;i<n;i++){        x[i]=i+1;    }    h=sloution();    if(h==0)   return 0;    for(i=0;i<n;i++){        printf("%d ",x[i]);    }      return 0;}
另外此题还证明了C++ STL的强大。。。。。下面是另外一种方法
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;#define INF 1000000int x[74];int n,sum;int sumn(int k,int l){    int i;    __int64 e;    e=1;    if(k==0||l==0)    return 1;    for(i=0;i<k;i++){        e=e*l;        l--;    }    return e;}int qwe(int a,int b){    __int64 e;    if(a==0||a==n-1){        return 1;    }    else{        e=sumn(a,b)/sumn(a,a);    }    return e;}int finalsum(){    int r=0;    int u;    for(u=0;u<n;u++){        r+=x[u]*qwe(u,n-1);    }    return r;}int sloution(){    int u;    int e;    int g;    e=sumn(n,n);    for(u=0;u<e;u++){        g=finalsum();        if(g==sum){            return 1;        }        next_permutation(x,x+n);//过完这题之后才知道STL里面有这么个强大的函数。。。    }    return 0;}int main(){    while(cin >> n >> sum){    if(n>10)    continue;    int i,h;    memset(x,0,sizeof(x));    for(i=0;i<n;i++){        x[i]=i+1;    }    h=sloution();    if(h==0)   continue;    for( i = 0; i < n; ++i)        {            cout << x[i] << " ";        }        cout << endl;    }    return 0;}

0 0
原创粉丝点击