zoukankan      html  css  js  c++  java
  • 小明搬家_NOI导刊2010提高(05)

    题目描述

    小明要搬家了,大家都来帮忙。

    小明现在住在第N楼,总共K个人要把X个大箱子搬上N楼。

    最开始X个箱子都在1楼,但是经过一段混乱的搬运已经乱掉了。最后大家发现这样混乱地搬运过程效率太低了,于是总结出了提高效率的方法。

    大家的速度都是每分钟上(或下)一层楼。所有向上走的人手中都拿一个箱子,所有向下走的人手中都不拿箱子。到达第N层立刻放下箱子向下走,到达第1层立刻拿起箱子向上走。当一个人向上走,另一人向下走而在楼道里相遇时,向上走的人将手中的箱子交给另一人,两人同时反向。即原来拿箱子向上走的人不拿箱子向下走,原来不拿箱子向下走的人现拿着箱子向上走。

    求将所有箱子搬完所需的最短时间。

    输入输出格式

    输入格式:

    第一行N(N≤10^9),K(K≤500000),M(M≤10^9),分别表示楼层数、人数、还放在一楼地上的箱子数。

    接下来K行,每行两个数Ai,Bi。

    Ai表示第i人现所在的楼层数,Bi为0或1,为0表示第i人正拿着箱子向上走,为1表示第i人不拿箱子向下走。

    输入满足没有任意两人正在同一楼层,在第1层的人一定正拿着箱子向上走,在第N层的人一定正不拿箱子向下走。

    输出格式:

    仅包含一个整数,为搬完箱子的时间。

    输入输出样例

    输入样例#1:
    5 2 4
    1 0
    3 0
    
    输出样例#1:
    20

    说明

    对于30%的数据有K≤100,M≤100;

    对于60%的数据有K≤1000,M≤l09;

    对于l000/o的数据有K≤500000,M≤109。

    这道题分析时可以忽略“当一个人向上走,另一人向下走而在楼道里相遇时,向上走的人将手中的箱子交给另一人,两人同时反向”这句话,因为想想就知道换了和没换其实差不多

    跟蓝皮书上的一道叫什么蚂蚁的题想法很像

    分析时先假设所有人都一起搬了整数趟回到原来位置,然后若刚好搬完则把这些时间加上所有人中距楼顶所需时间最大的人的时间(向下时时间为负数),没有正好搬完则从最小时间开始依次再加一趟,然后再取最长的时间

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int s[500001],cnt;
     7 long long n,k,m;
     8 int main()
     9 {int i,a,b;
    10   cin>>n>>k>>m;
    11   for (i=1;i<=k;i++)
    12     {
    13       scanf("%d%d",&a,&b);
    14       if (b==0) s[++cnt]=n-a;
    15       else s[++cnt]=a-n;
    16     }
    17   sort(s+1,s+k+1);
    18   s[0]=s[k];
    19   cout<<(m/k)*(n-1)*2+s[m%k];
    20 }
  • 相关阅读:
    RS485通信和Modbus协议(转)
    Modbus通讯错误检测方法
    Modbus消息帧
    Modbus通讯两种传输方式
    echarts自定义图例legend文字和样式
    host文件的作用
    webpack --watch和supervisor的不同
    vue中如何使用echarts
    Vue父子组件生命周期
    Git总结笔记
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/7487101.html
Copyright © 2011-2022 走看看