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