问题描述
试题编号: | 201803-2 |
试题名称: | 碰撞的小球 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。 提示 因为所有小球的初始位置都为偶数,而且线段的长度为偶数,可以证明,不会有三个小球同时相撞,小球到达线段端点以及小球之间的碰撞时刻均为整数。 输入格式 输入的第一行包含三个整数n, L, t,用空格分隔,分别表示小球的个数、线段长度和你需要计算t秒之后小球的位置。 输出格式 输出一行包含n个整数,用空格分隔,第i个整数代表初始时刻位于ai的小球,在t秒之后的位置。 样例输入 3 10 5 样例输出 7 9 9 样例说明 初始时,三个小球的位置分别为4, 6, 8。 样例输入 10 22 30 样例输出 6 6 8 2 4 0 4 12 10 2 数据规模和约定 对于所有评测用例,1 ≤ n ≤ 100,1 ≤ t ≤ 100,2 ≤ L ≤ 1000,0 < ai < L。L为偶数。
|
这两种方法刚开始错误的原因 都是把判断两个相邻的小球是否会碰撞的程序 放在了每个点走一步的程序中
方法一(100分):暴力模拟
注意:输入不一定是按从左往右的顺序,所以判断是否碰撞需要一个一个比,不能只比相邻的
#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
int main(){
int n,l,t;
int a[105],step[105];
scanf("%d%d%d",&n,&l,&t);
fill(step,step+105,1); //初始化
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
//判断是否到端点
if(a[i]==l||a[i]==0)
step[i]=-step[i];}
while(t--){
for(int k=1;k<=n;k++){
a[k]+=step[k];
//判断是否到端点
if(a[k]==l||a[k]==0)
step[k]=-step[k];
//因为不全都是按从左往右顺序输入数据的,所以判断是否碰撞需要一个一个比
}for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++)
if(a[i]==a[j]){
step[i]=-step[i];
step[j]=-step[j];}
}
}
for(int i=1;i<=n;i++){
if(i!=1)
printf(" ");
printf("%d",a[i]);
}
return 0;}
方法二(100分):用结构体,排序,只要比较相邻的就可
布尔函数用法不熟悉
错了无数次,终于改对了
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
//定义结构体
struct ball{
int id;
int pos;
int step;
};
//cmp1用来按坐标的先后顺序排序
bool cmp1(ball a,ball b){
return a.pos<b.pos;
}
//cmp2用来按输入的先后顺序排序,在最后输出的时候用
bool cmp2(ball a,ball b){
return a.id<b.id;
}
int main(){
int n,l,t;
struct ball a[105];
cin>>n>>l>>t;
for(int i=0;i<n;i++){
a[i].id=i;
cin>>a[i].pos;
a[i].step=1;
if(a[i].pos==l||a[i].pos==0)
a[i].step=-a[i].step;
}
sort(a,a+n,cmp1); //按坐标的先后顺序排序
while(t--){
for(int i=0;i<n;i++)
a[i].pos+=a[i].step;
if(a[0].pos==0) //判断首是否到左端点
a[0].step=-a[0].step;
if(a[n-1].pos==l) //判断尾是否到右端点
a[n-1].step=-a[n-1].step;
//判断中间的是否相碰
for(int j=0;j<n-1;j++){
if(a[j].pos==a[j+1].pos){
a[j].step=-a[j].step;
a[j+1].step=-a[j+1].step;
}
}
}
sort(a,a+n,cmp2);
for(int k=0;k<n;k++){
cout<<a[k].pos<<" ";
}
cout<<endl;
return 0;}