栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CSP CCF: 201803-2 碰撞的小球 (C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CSP CCF: 201803-2 碰撞的小球 (C++)

目录
  • 题目来源
  • 注意点
  • 代码

题目来源

碰撞的小球

注意点
  1. 输入数据可能是无序的。
  2. 输出时需要按照输入时小球的顺序来输出他们的位置。
代码
#include 
#include 
#include 
#include 

using namespace std;

struct Node{
    int loc;
    int dir;  // 1 : 向右; -1: 向左
};

vector nodes; // vector的话方便排序

bool cmp(Node a, Node b) {
    return a.loc < b.loc;
};

int main() {
    int N,L,T;
    cin>>N>>L>>T;

    for (int i = 0; i < N; ++i) {
        int cur;
        cin>>cur;
        nodes.push_back(Node{cur, 1});
    }

    // 
    map mymap1, mymap2;
    for (int i = 0; i < N; ++i) {  // 记录原始数据的位置与下标的映射关系
        mymap1[nodes[i].loc] = i;
    }
    sort(nodes.begin(), nodes.end(), cmp);   // 原始数据可能是无序的, 需要排序
    for (int i = 0; i < N; ++i) {  // 记录排序后数据的位置与下标的映射关系
        mymap2[nodes[i].loc] = i;
    }
    int indexs[N];  // new 2 original
    int index = 0;
    for (pair p: mymap2) {  // 记录排序后数据与原始数据的下标的映射关系
        indexs[index++] = mymap1[p.first];
    }

    //
    for (int i = 0; i < T; ++i) {  // i 时刻
        Node nxtnodes[1002];

        // 全部到下一步的位置
        for (int j = 0; j < N; ++j) {
            if (nodes[j].loc == 0 ) {  // <0, x> -> <1, 1>
                nxtnodes[j].loc = 1;
                nxtnodes[j].dir = 1;
                //cout<<"1: "<  //  -> 
                nxtnodes[j].loc = L - 1;
                nxtnodes[j].dir = -1;
                //cout<<"2: "<
                nxtnodes[j].loc = nodes[j].loc + nodes[j].dir;
                nxtnodes[j].dir = nodes[j].dir;
                //cout<<"3: "<
            if (j < N - 1 && nxtnodes[j].loc ==  nxtnodes[j + 1].loc) {  // 相撞
                nodes[j].loc = nxtnodes[j].loc;
                nodes[j + 1].loc = nxtnodes[j + 1].loc;
                nodes[j].dir = -1;
                nodes[j + 1].dir = 1;
                ++j;
            }
            else {
                nodes[j].loc = nxtnodes[j].loc;
                nodes[j].dir = nxtnodes[j].dir;
            }
        }
    }

    // 一定要记得输出的时候得按原来的顺序
    int ans[N];
    for (int i = 0; i < N; ++i) {
        ans[indexs[i]] = nodes[i].loc;
    }
    for(int i = 0; i < N; ++i) {
        cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938036.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号