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
- poj 3187
- poj 3187
- poj 3187
- poj 3187
- POJ 3187
- 【POJ】3187
- POJ 3187 爆搜
- poj 3187 (康托逆展开)
- POJ 3187 (DFS)
- 【poj】3187全排列
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- lex和yacc
- hdu 4309 状压枚举+最大流
- lex和yacc例子
- Java中Properties类的使用
- SQLITE3 使用总结
- poj 3187
- BITACM 1045 A^B mod C v2.0
- winpcap学习(一)
- android actionbar 直接显示在 actionbar栏上面
- 获取logcat日志
- HDU 4135 Co-prime 解题报告(因式分解 + 容斥原理)
- C#专题二:教务管理系统中的另个一个登陆方式(另附资源链接)
- 宇野実彩子-好莱坞明星
- 图像处理相关的重要期刊汇总