日常训练赛 Problem C – Complete Naebbirac’s sequence
比赛链接https://vjudge.net/contest/256988#status/17111202012/C/0/
大意:三个操作,使得输入的数中,从1-n,每一个数出现的次数相同。
wa代码(只是考虑了三个数的情况):
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std;
# define maxn 1000+10
# define inf 0x3f3f3f3f
int vis[maxn];
int main()
{
int n,m;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
int temp;
scanf("%d",&temp);
vis[temp]++;
}
if((m+1)%n==0)
{
int t=(m+1)/n;
int num1=0,num2=0;
int s=0;
for(int i=1; i<=n; i++)
{
if(vis[i]!=t)
{
num1++;
num2=vis[i];
s=i;
}
}
if(num1==1&&num2==t-1)
{
printf("+%d\n",s);
return 0;
}
}
if((m-1)%n==0)
{
int t=(m-1)/n;
int num1=0,num2=0;
int s=0;
for(int i=1; i<=n; i++)
{
if(vis[i]!=t)
{
num1++;
num2=vis[i];
s=i;
}
}
if(num1==1&&num2==t+1)
{
printf("-%d\n",s);
return 0;
}
}
if(m%n==0)
{
int temp=m/n;
int s1=inf,s2=-inf,w1,w2;
for(int i=1; i<=n; i++)
{
if(vis[i]<s1)
{
s1=vis[i];
w1=i;
}//出现的最小次数
if(vis[i]>s2)
{
s2=vis[i];
w2=i;
}//出现的最多次数
}
if(s1==s2-2&&s1+1==temp)
{
printf("-%d+%d\n",w2,w1);
return 0;
}
}
printf("*\n");
return 0;
}
AC代码(新思路,按照平均数来找):
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdio.h>
using namespace std;
# define maxn 1000+10
# define inf 0x3f3f3f3f
int vis[maxn];
int main()
{
int n,m;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
{
int temp;
scanf("%d",&temp);
vis[temp]++;
}
if((m+1)%n==0)
{
int t=(m+1)/n;
int num1=0,num2=0;
int s=0;
for(int i=1; i<=n; i++)
{
if(vis[i]!=t)
{
num1++;
num2=vis[i];
s=i;
}
}
if(num1==1&&num2==t-1)
{
printf("+%d\n",s);
return 0;
}
}
if((m-1)%n==0)
{
int t=(m-1)/n;
int num1=0,num2=0;
int s=0;
for(int i=1; i<=n; i++)
{
if(vis[i]!=t)
{
num1++;
num2=vis[i];
s=i;
}
}
if(num1==1&&num2==t+1)
{
printf("-%d\n",s);
return 0;
}
}
if(m%n==0)
{
int temp=m/n;
int s1=inf,s2=-inf,w1,w2;
for(int i=1; i<=n; i++)
{
if(vis[i]<s1)
{
s1=vis[i];
w1=i;
}//出现的最小次数
if(vis[i]>s2)
{
s2=vis[i];
w2=i;
}//出现的最多次数
}
if(s1==s2-2&&s1+1==temp)
{
printf("-%d +%d\n",w2,w1);
return 0;
}
}
printf("*\n");
return 0;
}