ACM复习(28)9503 懒人选座位

Description
在ACM混了一年之后,我终于有机会在新生赛出题了。然后我瞬间出了一道题。
(好吧,我承认,我只是翻译了原题而已╮(╯▽╰)╭)

发过去给lyd,然后马上被鄙视了:“这么简单的题目?”
哎,没办法啊,过去一年我就是切水题过来的~~

其实我个人认为这题还是挺有趣的……水水更健康吗……大家一起来切水题吧!

相信大家都有这样的体验吧:课室里每行座位间的间距都很小,上课的时候,早到的同学都要侧身或者站起来,让其他同学坐进去里面。
╮(╯▽╰)╭ 我是一个很懒的人,假如我是第一个到场,我希望选了座位之后,侧身让位的次数能够尽量地少……
现在有一排n个空座位,从左到右分别编号1 ~ n。 然后其他同学都会选定一个座位然后走进去,并且进去的方位(左边or右边)服从以下的规定:
1. 选择途经人数最少的方向进入
① ② 我 ③ ④ ⑤ ⑥
比如第二个到的同学选定了3号座位,他会选择从右边进入,我不用让位。
2. 当两端途经的人数一样时,选择靠近自己座位的那边进入。
① ② 我 ③ ④ ⑤ 有人 ⑥
比如第三个到的同学选择坐3号座位,他会从左边进入,然后我要让位。
3. 都一样时,随机选进入方位。
现在的问题是,当我选择坐第k个座位后,我想知道在最坏的情况下,要侧身让位多少次?

输入格式
有若干组数据,以EOF判定结束。
每组数据第一行有两个整形n(1~ 30)和q(1~30)。分别表示座位数和查询次数。接下来一行有q个整型。k1,k2……kq,分别表示我选择坐第k个座位。数据以空格分隔。

输出格式
每组数据一行,对于每次查询,输出一个结果,以空格分隔。

输入样例
4 4
1 2 3 4
5 5
1 2 3 4 5

输出样例
1 0 0 1
2 1 0 1 2

提示
四个座位的时候,我选定座位①后,若第二个人选了③or④,当第三个人选②,我就要让位一次,这个是最坏的情况。
EOF结束即是数据读入以文件结束符结束。即输入输出类似如下(当然变量名啥的不必一样,VC下按ctrl+z 然后
回车可结束程序):
while(scanf(“%d%d”,&n,&q)!=EOF)
{
for(i=1;i<=q;i++)
scanf(“%d”,&act[i]);
……
……
printf(“%d\n”,answer);
}


解题思路

列举几个数据就能发现规律

这里写图片描述

#include<stdio.h>
int main()
{
    int n, q, t, w, k, e, num[31], record[31];
    while(scanf("%d %d", &n, &q) != EOF)
    {
        for(int i = 0; i < q; i ++)
            scanf("%d", &num[i]);
        if(n <= 3) 
        {
            record[2] = 0;
            record[3] = 1;
            if(n == 3)
                record[1] = 1;
            else
                record[1] = 0;
        }               
        else
        {
            e = n / 2;
            t = w = n - 3;
            k = 1;
            while(e -- > 0)
                record[k ++] = t --;
            if(n % 2 == 0)
                t ++;
            while(t <= w)
                record[k ++] = t ++;
        }
        for(int i = 0; i < q; i ++)
            printf("%d ", record[num[i]]);
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值