http://acm.hdu.edu.cn/showproblem.php?pid=5826
题意:T组数据,n个球,球的加速度和速度成绩为定值C。每个球初始的速度位置和方向。速度的方向都和加速度的方向是一样的。可以进行弹性碰撞,弹性碰撞后动量不变,m大小都一样,也就是说速度交换。m次询问,问第t秒钟,第k小的球的速度是多少?
解析:哈哈哈,本宝宝终于推出来一次了,不容易。就一个方程av = c,然后我们都知道的a = dv/dt
注意啊,不是积分是解微分方程!这两点的区别。。。。。反正解方程才是希望。。。。
v * dv / dt = C
v * dv = C * dt
对两边同时积分。谁知道为什么变量不同却可以同时积分????
V^2 / 2 = Ct + C0
V0值及v的初始值代入就可以求出C0的大小
最后推出公式:
v = √2ct + v0 ^2
由于是一样的v0大v就大,对v0排序就行了
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=3e5+7;
int s;
int tot;
char str[maxn];
int n;
int main(){
int t;
scanf("%d",&t);
while(t--){
tot=0;
int flag=0;
int ls=-1;
s=0;
scanf("%d",&n);
scanf("%s",str);
if(n==2){
if(str[0]==')'&&str[1]=='('){
printf("Yes\n");
}else printf("No\n");
continue;
}
if(n%2){
printf("No\n");
continue;
}
int ll=0,rr=0;
for(int i=0;i<n;i++){
// cout<<str[i]<<"i"<<endl;
if(str[i]=='('){
s++;
ll++;
}else if(str[i]==')'){
rr++;
if(s==0){
if(ls!=-1){
flag=1;
break;
}
ls=i;
}else{
// cout<<s[tot]<<endl;
s--;
}
}
}
if(ll!=rr)flag=1;
if(flag){
printf("No\n");
continue;
}
if((ls!=-1&&s==1)||(ls==-1&&s==0)){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}