C语言

       嘉宾席是间隔为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值