CSP认证201803-2碰撞的小球[C++题解]:模拟
生活随笔
收集整理的這篇文章主要介紹了
CSP认证201803-2碰撞的小球[C++题解]:模拟
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目解答
- 題目鏈接
題目解答
來源:acwing
分析:
題目理解:
給定水平方向的線段和n個小球,給定速度和碰撞后反向運動等條件,模擬小球碰撞過程,求解最后時刻所有小球的位置。
題目解答:
這是一道模擬題,最直觀的想法是模擬t秒,把每一秒的過程模擬出來。
具體如何操作?
第i-1個小球的位置:b[i].p += b[i].v;
第i-1個小球的速度:b[i].v ++;
如果發生碰撞:b[i].v *= -1;
AC代碼
#include<bits/stdc++.h> using namespace std; const int N = 110; int n, L, T; struct Ball{// 小球的位置,小球的速度int p, v; }b[N];int main(){cin >> n >> L >> T;for(int i = 0; i < n; i ++){cin >> b[i].p; b[i].v = 1; // 初始時速度向右,大小為1}// 模擬T秒while(T --){// 每次前進1秒(可能向前,可能向后)for(int i = 0; i < n; i ++){b[i].p += b[i].v; // 更新位置// 撞到兩邊的墻if(b[i].p == L || !b[i].p) b[i].v *= -1;}// 模擬兩個球相撞for(int i = 0; i < n; i ++){for(int j = i + 1; j < n; j ++){if(b[i].p == b[j].p){ // 位置重疊,表示相撞b[i].v *= -1, b[j].v *= -1;}}}}for(int i = 0; i < n; i ++)cout << b[i].p << ' '; }題目鏈接
https://www.acwing.com/problem/content/3261/
總結
以上是生活随笔為你收集整理的CSP认证201803-2碰撞的小球[C++题解]:模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSP认证201803-1跳一跳[C++
- 下一篇: CSP认证201803-3URL映射[C