得分:3 罚时:0:46:11 排名:22
这次第三题计算几何可能不太友好~~~
A. AcWing4497-吃饭
惯例语言入门题,1min切掉。(输出答案)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin>>T;
long long a,b,c;
while(T--)
{
scanf("%lld %lld %lld",&a,&b,&c);
printf("%lld\n",(a+b+c)/2);
}
return 0;
}
B. AcWing4498-指针
这题的话 n<=15 直接打 O(2n) 的dfs就行吧
#include<bits/stdc++.h>
using namespace std;
const int MAXN=20;
int a[MAXN];
int n;
bool dfs(int x,int sum)
{
if(x>n)
{
if(!sum) return 1;
return 0;
}
if(dfs(x+1,(sum+a[x])%360)) return 1;
if(dfs(x+1,(sum-a[x]+360)%360)) return 1;
return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
if(dfs(1,0)) printf("YES");
else printf("NO");
return 0;
}
C. AcWing4499-画圆
计算几何对于没接触的OIer可能不太友好,不过其实也不难。
这道题的话分两种情况讨论,给定点在圆内或圆外。
圆外:答案即是给定圆。
圆内:r=(R+d)/2,坐标的话用解析几何计算一下就行(详细见注释)。
#include<bits/stdc++.h>
using namespace std;
double dist(int x,int y,int xx,int yy)
{
return sqrt((double)(x-xx)*(x-xx)+(double)(y-yy)*(y-yy));
}
int main()
{
int x1,y1,r,x2,y2;
cin>>r>>x1>>y1>>x2>>y2;
if(r<=dist(x1,y1,x2,y2)) printf("%.6f %.6f %.6f",(double)x1,(double)y1,(double)r);
else
{
double d=dist(x1,y1,x2,y2);
double R=(d+r)/2;
double x,y;
if(y1==y2)
{
if(x1>=x2) x=x2+R;
else x=x2-R;
y=y1;
}
else if(x1==x2)
{
if(y1>=y2) y=y2+R;
else y=y2-R;
x=x1;
}
else
{
double k=fabs((double)(y1-y2)/(x1-x2));
double alpha=atan(k);
if(x1>=x2)
{
if(y1>=y2) x=x2+R*cos(alpha),y=y2+R*sin(alpha);
else x=x2+R*cos(alpha),y=y2-R*sin(alpha);
}
else
{
if(y1>=y2) x=x2-R*cos(alpha),y=y2+R*sin(alpha);
else x=x2-R*cos(alpha),y=y2-R*sin(alpha);
}
}
//else x=x2+k*R,y=y2+k*R;
printf("%.6f %.6f %.6f",x,y,R);
}
return 0;
}