。
嘉宾席是间隔为1,一字排开的n个座椅,从左至右标号为1到n。有m个嘉宾,每个嘉宾有一个心仪座位Ai,注意,不同嘉宾的心仪座位可能相同。嘉宾们会统一从一排座位的最左侧依次入场。一个嘉宾首先会走到他心仪的位子,如果此时他发现没有人坐,他就会立刻占据这个位子。如果已经有人坐了,该嘉宾会继续向右走,直到遇到一个空位子,立刻坐下。每个嘉宾的怒气值是他额外行走的距离,也就是最终的座位到心仪座位的距离。如果走到最后都没有找到位置,嘉宾会怒气爆棚。
显然,座位存在一个先到先得的关系,不是每个人都能坐到心仪的座位。现在,猪猪想思考什么样的入场顺序可以使嘉宾们怒气值之和最小,请你帮帮他。
输出最小怒气和。如果无论怎样安排入场顺序,都不能使所有嘉宾找到位子,输出-1。
虽然不能严谨的证明,但是其实自己模拟几组数据再操作一下就发现,无论怎么操作只要每个人的愿望座位定下来,总怒气值就是定值,都不会变
所以我们可以设置两个数组,用for循环让其中一个数组的所有数都变成0;然后用for循环判断其中的某个数组里的数是不是0;如果是,让他变成1;然后进行下一段判断,以此类推在数字达到a的值时,让循环数变1,然后重新循环;最后输出值;
代码以下,小白,请各位大佬多多指教。
#include<stdio.h>
int main()
{
int a,b,c,d=0,i,j,s;
scanf("%d %d",&a,&b);
int m[b+1],n[a+1];
for(i=1;i<=a;i++)
n[i]=0;
if(a>=b)
{
for(i=1;i<=b;i++)
scanf("%d",&m[i]);
for(i=1;i<=b;i++)
{
if(n[m[i]]==0)
n[m[i]]=1;
else
{
s=m[i];
while(n[s])
{
d++;
if(s==a)
{
s=1;
d++;
}
s++;
}
if(n[s]==0)
n[s]=1;
}
}
printf("%d",d);
}
else
printf("-1");
return 0;
}