满分代码
#include <iostream>
#include <algorithm>
using namespace std;
struct Ball
{
int id=0;
int a=0;
int flag=1;
};
struct Ball ball[101];
bool cmp(Ball x,Ball y)//小到大排
{
return x.a < y.a; //根据a从小到大排列
}
bool cmp2(Ball x,Ball y)//小到大排
{
return x.id < y.id; //根据id从小到大排列
}
int main()
{
int n,L,t;
cin>>n>>L>>t;
for(int i=0; i<n; i++)
{
cin>>ball[i].a;
if(ball[i].a==L)ball[i].flag*=-1;
ball[i].id=i;
}
sort(ball,ball+n,cmp);
while(t>0)
{
for(int i=0; i<n; i++)
{
ball[i].a+=ball[i].flag;
if(ball[i].a == L || ball[i].a == 0)
ball[i].flag*=-1;
}
for(int i=1; i<n; i++)
if(ball[i].a == ball[i - 1].a){
ball[i].flag*= -1;
ball[i-1].flag*=-1;
}
//for(int i=0; i<n; i++)
// cout<<ball[i].a<<" ";
// cout<<endl;
t--;
}
sort(ball,ball+n,cmp2);
for(int i=0; i<n; i++)
cout<<ball[i].a<<" ";
return 0;
}
小结:
学会使用结构体排序以后轻松了不少呀,不过编程最恶心的就是测试用例全对,交上去就报错,找bug是真的难顶,开始使用的代码,找半天不知道哪错了,最后借鉴了网上的一些成功案例,直接暴力穷举,我觉得这种测试就暴力算法好了,写对才是王道,性能第二
#include <iostream>
#include <algorithm>
using namespace std;
struct Ball
{
int id=0;
int a=0;
int flag=0;
};
struct Ball ball[101];
bool cmp(Ball x,Ball y)//先按x从小到大排,相同,再按y从小到大
{
return x.a < y.a; //根据a从小到大排列
}
bool cmp2(Ball x,Ball y)//先按x从小到大排,相同,再按y从小到大
{
return x.id < y.id; //根据id从小到大排列
}
int main()
{
int n,L,t;
cin>>n>>L>>t;
for(int i=0; i<n; i++)
{
cin>>ball[i].a;
ball[i].id=i;
}
sort(ball,ball+n,cmp);
while(t>0)
{
for(int i=0; i<n; i++)
{
if( ball[i].a>0&& ball[i].a<L) //未碰壁
{
if(ball[i].flag==0) //正向
{
if(ball[i].a==ball[i+1].a){
ball[i]. flag=1;//碰撞反向
ball[i].a-=2;
ball[i+1].flag=0;
}
ball[i].a++;
}
else if(ball[i].flag==1) //反向
{
if(ball[i].a==ball[i-1].a){
ball[i]. flag=0;//碰撞反向
ball[i].a+=2;
ball[i-1].flag=1;
}
ball[i].a--;
}
}
else if(ball[i].a==L)
{
ball[i].flag=1;
ball[i].a--;
}
else if(ball[i].a==0)
{
ball[i].flag=0;
ball[i].a++;
}
cout<<ball[i].a<<" ";
}
cout<<endl;
sort(ball,ball+n,cmp);
t--;
}
sort(ball,ball+n,cmp2);
for(int i=0; i<n; i++)
cout<<ball[i].a<<" ";
return 0;
}