组合数学 poj 2356-鸽巢原理,poj 3270-群-循环,

来源:互联网 发布:js图片转base64 场景 编辑:程序博客网 时间:2024/05/04 16:01


 poj 2356-鸽巢原理

http://blog.csdn.net/prime7/article/details/8581420

#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>#include<algorithm>#include<vector>using namespace std;#define ll long long#define inf 0x3f3f3f3fint a[10010];int s[10010];int f[10010];int main(){int n,i,j,k;scanf("%d",&n);s[0]=0;memset(f,0,sizeof(f));for(i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]+a[i];}for(i=1;i<=n;i++){int ans=s[i]%n;if(ans==0){printf("%d\n",i);for(j=1;j<=i;j++){printf("%d\n",a[j]);}break;}if(f[ans]==0)f[ans]=i;else{printf("%d\n",i-f[ans]);for(j=f[ans]+1;j<=i;j++)printf("%d\n",a[j]);break;}}//system("pause");}


poj 3270-群-循环

http://blog.csdn.net/weixinding/article/details/7256204

#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>#include<algorithm>#include<vector>using namespace std;#define ll long long#define inf 0x3f3f3f3fint a[10010];int c[10010];int f[10010];int b[100010];int main(){int n;scanf("%d",&n);int i,j,k;int MN=inf;for(i=1;i<=n;i++){scanf("%d",&a[i]);c[i]=a[i];MN=min(MN,a[i]);}sort(c+1,c+1+n);for(i=1;i<=n;i++){b[c[i]]=i;}memset(f,0,sizeof(f));int ans=0;for(i=1;i<=n;i++){if(f[i]==1) continue;int t=i;f[t]=1;int sum=c[i];int mn=c[i];int l=1;while(a[t]!=c[i]){sum+=a[t];mn=min(mn,a[t]);t=b[a[t]];f[t]=1;l++;}ans+=min(sum+(l-2)*mn,sum+mn+(l+1)*MN);}printf("%d\n",ans);//system("pause");}



0 0