hdu 6362 oval-and-rectangle
http://acm.hdu.edu.cn/showproblem.php?pid=6362
求定积分。。。注意输出的要求即可
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
double pi=acos(-1.0);
cin>>t;
while(t--)
{
double a,b;
cin>>a>>b;
double ans=2*b*b;
ans=ans+a*b*pi;
ans=ans/b;
ans=ans*1000000;
long long ans1=ans;
ans=ans1;
ans=ans/1000000;
printf("%.6lf\n",ans);
}
return 0;
}
hdu 6370 oval-and-rectangle
http://acm.hdu.edu.cn/showproblem.php?pid=6370
找环。认为a说b是村民则a指向b一条权值为0的边,狼则为1.找到一个环路径权值和为1,那么那个1指向的则是狼,然后从这个狼开始dfs找到说这狼是民的都也是狼,说这些狼是民的也都是狼。
#include<bits/stdc++.h>
using namespace std;
vector<int>p[111111];
int ta[111111][2];
int T;
char s[16];
int pa[111111];
int ans;
int dfs(int x)
{
if(p[x].size()==0)return 0;
int ans1=p[x].size();
for(int i=0;i<p[x].size();i++)
{
ans1+=dfs(p[x][i]);
}
return ans1;
}
bool vis[111111];
int main()
{
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
p[i].clear();
ans=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
int id;
scanf("%d %s",&id,s);
if(s[0]=='w')
{
ta[i][0]=id;
ta[i][1]=1;
}
else{
ta[i][0]=id;
ta[i][1]=0;
p[id].push_back(i);
}
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
int id=i;
vis[i]=1;
int js=0;
pa[js++]=i;
while(vis[ta[id][0]]==0)
{
vis[ta[id][0]]=1;
pa[js++]=ta[id][0];
id=ta[id][0];
}
int wz=-1;
for(int j=0;j<js;j++)
{
if(pa[j]==ta[id][0])
wz=j;
}
if(wz!=-1)
{
int sum=0;
int idd=0;
for(int j=wz;j<js;j++)
{
sum+=ta[pa[j]][1];
if(ta[pa[j]][1]==1)
{
idd=ta[pa[j]][0];
}
}
if(sum==1)
{
ans++;
ans+=p[idd].size();
for(int j=0;j<p[idd].size();j++)
{
ans+=dfs(p[idd][j]);
}
}
}
}
}
cout<<"0 "<<ans<<endl;
}
return 0;
}
hdu 6373 pinball
http://acm.hdu.edu.cn/showproblem.php?pid=6373
物理题,队友推的。。。模拟即可
include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const double g=9.8;
int T;
double a,b,x,y;
const double pi=acos(-1.0);
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf",&a,&b,&x,&y);
double t,vx,vy,v;
t=sqrt(2.0*(y-b/a*(-x))/g);
vx=0;
v=vy=g*t;
int ans=0;
double j1=atan(b/a),j2=pi/2-j1;
vx=v*cos(fabs(j2-j1));
vy=v*sin(fabs(j2-j1));
double sx = -x;
while(sx > 0){
ans++;
if(j2>=j1) t=vy*2/g;
else t=0;
double X=2*(vy-b*vx/a),Y=2*b*vx*t/a;
double t1=(-X+sqrt(X*X+4*g*Y))/2/g;
t=t+t1;
vy=vy+g*t1;
sx-=vx*t;
if(vx==0) j2=pi/2;
else j2=atan(vy/vx)-j1;
v=sqrt(vx*vx + vy*vy);
vx=v*cos(fabs(j2-j1));
vy=v*sin(fabs(j2-j1));
}
printf("%d\n", ans);
}
return 0;
}