XDOJ1042 - Qinz喝饮料

Description

Qinz这就要乘飞机去参加百度总决赛了!在飞机上的饮料可是免费的,Qinz大牛可不能错过这次好机会。
飞机上共有n个座位,且排成一列,而且这一列上面都已经有乘客了(编号从1到n),每个乘客都需要一杯茶或者一杯咖啡。漂亮的空姐正准备给每位乘客送饮料。
在座位的前方有一个供应饮料的机器,可以提供茶叶和咖啡两种饮料,空姐每次可以在供应机处使用容量为
7的托盘,也就是可以放7杯饮料,且每次只可以装茶或者咖啡一种饮料。
空姐每次可以做如下动作:
1:从供应机处移动到第一个座位或从座位移动到供应机,需要一秒钟。
2:从座位i移动到座位i+1或者从座位i+1移动到座位i,需要一秒钟。
3:给每位乘客提供饮料,需要四秒钟。
4:空姐在返回供应机处取饮料需要47秒钟。

Qinz想要知道空姐给所有乘客供应饮料最少需要多长时间

Input

第一行包含一个整数T,表明有T组输入数据。
接下来的T组输入数据中,每组数据第一行包含两组整数 n(1<=n<=1000) 和 m (1<=m <=n),分别表示总的乘客人数与要喝茶的人数.
接下的一行有 m 个整数,每个整数 i 表示 编号为 i的乘客需要喝茶。其余的 n-m 位乘客喝咖啡。

Output

对于每组输入输出一个整数,表明供应饮料所需的最少时间。

Sample Input

3
2 1
1
2 2
2 1
15 7
1 2 3 4 5 6 7

Sample Output

108
59
261

Hint

在第一组数据中,第一位乘客喝茶而第二位乘客喝咖啡。空姐需要 从供应处取一杯茶,送给乘客1 并返回,这需要47+1+4+1=53.然后从供应处取一杯咖啡送给乘客2并返回。这需要47+2+4+2=55秒钟。
总共需要108秒钟。

 

#include<stdio.h>  
//模拟题,每次取茶和咖啡都一样,每次取7杯饮料然后从最远的地方往回送,直到全部服务完毕  
int main()  
{  
    int t,n,m,i,j,k;  
    int timepause;  
    scanf("%d",&t);  
    while(t--)  
    {  
        int time=0;//总时间  
        int mark[1010]={0};//喝咖啡的人设置为0,茶为1,已被服务-1  
        scanf("%d%d",&n,&m);//总人数,喝茶人数  
        j=m;  
        while(j--)  
        {  
            int temp;  
            scanf("%d",&temp);  
            mark[temp]=1;  
        }  
  
        int count=0;//统计共服务了多少人  
        int ans=0;//统计一次服务了多少人(防止一次服务超过七个人)  
        //先统计喝茶的人  
        for(i=n;i>=1;i--)  
        {  
            if(mark[i]==1)//要喝茶的人  
            {  
                if(ans==0)//从饮料机处找出最远的那一个要送饮料的人,再往前送  
                {  
                    timepause=i;  
                    time+=47;//每次取饮料时间  
                    time+=i;//从饮料机到最远那个人所用的时间  
                    mark[i]=-1;  
                    ans++;//统计一次服务了多少人(防止一次服务超过七个人)  
                    count++;  
                }  
                else//从上一个位置往这里送饮料  
                {  
                    mark[i]=-1;  
                    time+=(timepause-i);  
                    timepause=i;  
                    ans++,count++;  
                }  
                if(count==m)//喝茶的人全部服务完毕  
                {  
                    time+=i;//返回饮料机  
                    break;  
                }  
  
                if(ans==7)  
                {  
                    time+=i;//返回饮料机  
                    ans=0;  
                }  
            }  
  
        }  
  
        //开始统计喝咖啡的人  
        ans=0;  
        for(i=n;i>=1;i--)  
        {  
            if(mark[i]==0)//要喝咖啡的人  
            {  
                if(ans==0)//找最远的人  
                {  
                    timepause=i;  
                    time+=47;//每次取饮料时间  
                    time+=i;//从饮料机到最远那个人所用的时间  
                    mark[i]=-1;  
                    ans++;//统计一次服务了多少人(防止一次服务超过七个人)  
                    count++;  
                }  
                else  
                {  
                    mark[i]=-1;  
                    time+=(timepause-i);  
                    timepause=i;  
                    ans++,count++;  
                }  
                if(count==n)//全部服务完毕  
                {  
                    time+=i;//返回饮料机  
                    break;  
                }  
                if(ans==7)  
                {  
                    ans=0;//返回饮料机  
                    time+=i;  
                }  
            }  
        }  
        time+=(4*n);//最后加上每个人的服务时间  
        printf("%d\n",time);  
    }  
    return 0;  
}  

 

最后欢迎大家访问我的个人网站: 1024s

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值