首页 > 其他分享 >弹珠碰撞

弹珠碰撞

时间:2022-10-29 22:34:31浏览次数:65  
标签:1000010 arr 滚动 int 弹珠 线段 碰撞

  • 题目描述
    链接:https://ac.nowcoder.com/acm/contest/43844/E
    在一条长度为 n 的线段上,有 m 颗弹珠在匀速左右滚动,在 1 单位时间内,每颗弹珠能滚动 1 单位距离。第 i 颗弹珠由两个参数 di,pi描述,di是一个值为 0 或 1 的整数,表示弹珠初始向左滚动/向右滚动;pi是一个 1 到 n 之间的正整数,表示弹珠初始从线段上 pi位置出发。
    由于只有一条线段,两颗滚动方向相反的弹珠位置重合的时候就会停滞 1 单位时间不滚动,并交换两颗弹珠滚动的方向。需要注意的是,一颗弹珠可以反复发生碰撞,如果在停滞中受到碰撞,则停滞时间会累加。如果一颗弹珠滚到了位置 0 或位置 n+1,那么这颗弹珠就滚出了线段。
    请问最后一颗弹珠在什么时候滚出线段?可以证明所有弹珠都会在某个整数时刻滚出线段。
  • 分析
    当两个小球发生碰撞的时候,它们的前进的方向交换,但我们可以看成两个小球没有发生碰撞,而是互相穿过了彼此,假设小球此时的方向向右,位置为i,从位置i+1到位置n之间存在num个向左的小球,那么滚出线段的时间就为T = n+1-i+num,对于此题暴力的处理每一个小球滚出线段的时间最后取最大值即可,对于num的计算只需要维护一个前缀1的前缀和与后缀0的前缀和即可
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int f0[1000010];
int f1[1000010];
int b0[1000010];
int b1[1000010];
struct node{
    int d,p;
    bool operator <(const node& a) const{
        return a.p>p;
    }
}arr[1000010];
int main(){
    cin>>n>>m;
    for(int i = 1;i<=m;i++) cin>>arr[i].d;
    for(int i = 1;i<=m;i++) cin>>arr[i].p;
    sort(arr+1,arr+1+m);
    int pos = 1;
    for(int i = 1;i<=n;i++){
        if(arr[pos].p==i) {
            if(arr[pos].d==1)
                 f1[i] = f1[i-1]+1,f0[i] = f0[i-1];
             else 
                 f0[i] = f0[i-1]+1,f1[i] = f1[i-1];
            pos++;
        }
        else {
            f0[i] = f0[i-1];
            f1[i] = f1[i-1];
        }
}
    pos = m;
    for(int i = n;i>=1;i--){
        if(arr[pos].p==i) {
           // cout<<i<<endl;
            if(arr[pos].d==1)
                 b1[i] = b1[i+1]+1,b0[i] = b0[i+1];
             else 
                 b0[i] = b0[i+1]+1,b1[i] = b1[i+1];
            pos--;
        }
        else {
            b0[i] = b0[i+1];
            b1[i] = b1[i+1];
        }
}
    int ans = -1;
    int num = 0;
    for(int i = 1;i<=m;i++){
        if(arr[i].d==0){
            num = arr[i].p + f1[arr[i].p];
            ans = max(ans,num);
        }
        else{
            num = n+1-arr[i].p+b0[arr[i].p];
            ans = max(ans,num);
        }
    }
    cout<<ans<<endl;
}

标签:1000010,arr,滚动,int,弹珠,线段,碰撞
From: https://www.cnblogs.com/wujw11world/p/16840066.html

相关文章

  • md5碰撞
    0x3020~0x305b(12320~12379)12352=64*19312352+128+1=12481    0x3020=1232012352=64*1930x30bf-0x3020=159......
  • 【RFID】基于MATLAB的RFID 系统的空中接口过程以及防碰撞算法仿真
    1.软件版本matlab2013b2.本算法理论知识RFID的接口过程满足如下的结构框图:3.核心代码clc;%清屏closeall;%关闭所有窗口clearall;......
  • 面试官:Hash 碰撞是什么?如何解决?被问懵了……
    Hash如何存数据hash表的本质其实就是数组,hash表中通常存放的是键值对Entry。如下图:这里的学号是个key,哈希表就是根据key值来通过哈希函数计算得到一个值,这个值就是下......
  • JS + Canvas 碰撞检测
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content=......
  • 加工中心发生刀具碰撞的原因及如何避免?
    CNC加工中心加工精度高,尺寸稳定性好,劳动强度低,便于现代化管理。但由于操作不当或编程错误等原因,很容易使刀具或转塔撞击工件或机床,并会损坏刀具、已加工零件或机床零件,从而......
  • 算法实现2D OBB碰撞
    boxusingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassDrawLine:MonoBehaviour{publicVector3[]......
  • 物体碰撞与摩擦的方法总结
    本文禁止转载B站:Heskey0ContactandFrictionSimulationforComputerGraphics(Siggraphcourse2022)相关的course:SIGGRAPH'20Course:AnIntroductiontoPhysics......