• 【推导】zoj3981 Balloon Robot


    题意:一个桌子有m个位置(首尾相接),有n支队伍坐在其中的n个位置上。有个机器人会从某个起始位置出发,每个时刻会依次发生以下三个事件:

    机器人顺时针转一个单位;

    某些队伍通过了题目(如果存在);

    如果机器人的当前的位置的队伍需求气球,机器人就会把他需求的气球都给他。

    让你对于所有可能的初始位置,最小化所有队伍的所有题目的气球等待时长之和。

    设一个函数y轴是等待时间,x轴是机器人的初始位置,于是每道题恰好被分成了两个斜率为-1的一次函数。

    假设某道题目是在ci时刻由bi位置的队伍通过的,y=(bi-(x+ci)%m+m)%m

    最小化每个位置所有函数图像到x轴的距离之和。

    只需要枚举每个一次函数与x轴的交点,尝试用当前位置的值更新答案。

    单题的函数画出来是这样的。

    #include<algorithm>
    #include<cstdio>
    using namespace std;
    typedef long long ll;
    ll ans,sum;
    int n,m,K,T,s[100005],b[100005],c[100005],x[100005];
    int main(){
        scanf("%d",&T);
        for(;T;--T){
            ans=sum=0;
            scanf("%d%d%d",&n,&m,&K);
            for(int i=1;i<=n;++i){
                scanf("%d",&s[i]); --s[i];
            }
            for(int i=1;i<=K;++i){
                scanf("%d%d",&b[i],&c[i]);
                b[i]=s[b[i]];
            }
            for(int i=1;i<=K;++i){
                x[i]=(b[i]-c[i]%m+m)%m;
                sum+=(ll)x[i];
            }
            sort(x+1,x+K+1);
            ans=sum;
            for(int i=1;i<=K;++i){
                sum-=(ll)(x[i]-x[i-1])*(ll)K;
                ans=min(ans,sum);
                sum+=(ll)m;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    PHP学习(字符串和变量)
    一个操作配置文件(Reg,ini,XML)的类
    Indy中判断邮件来源
    PHP学习(MSSQL数据库连接)
    辛辛苦苦,写了个INNO的安装脚本
    php连接sqlserver
    Sql Server 使用CTE实现递归查询
    使用序列化和反序列化机制深度复制对象
    ASP.NET中不常用的另类绑定方法<%$ %>
    google map事件监听
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/7773720.html
Copyright © 2020-2023  润新知