poj 2356-鸽巢原理


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f

int 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-群-循环


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f

int 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");
}